第一章 Owl组件 学习笔记
官方提供了一个模块owl_playground,目的是专注于owl自身的学习,不要受到odoo web client的影响。不过这个模块年久失修,安装到Odoo17上是不能用的。
需要注释掉下面两行:
'web/static/src/legacy/js/promise_extension.js', # required by boot.js
'web/static/src/env.js', # required for services整个文档有11个小节,也就是11个任务。官方在github仓库中也提供了这11个任务的解决方案。
一路学下来,感觉有必要记住的东西,都在后文列出来。
0 模块结构
该模块我觉得可以从controller入手,根据所渲染的模板ID进入views/templates.xml,然后根据t-call-assets定位到manifest文件。
接下来,就开始探究src目录中的两个js文件和一个xml文件之前的关系了。
1 显示一个计数器
这一步实现点击按钮更改文字的效果。QWeb的语法在此就忽略了,重点看owl的语法。
useState是一个钩子,组件实例化后的再次响应靠的就是它。这里要记住的是只有object和array才能使用它。案例使用的是 { value: 1 }
2 将计数器改为一个组件
这一个任务是要将上一次增加的功能封装成一个Component,这样我们就有了两个Component:Playground和Count。
定义新的Component没有什么新的东西,主要是使用。在playground.js中,要import,还要放到components这个变量中,然后在模板中使用。
这里引出子组件的概念,稍微了解一下也挺好,因为我们做的是现有Playground,再有Count。但在解析子组件的时候,官方是从先有子组件,然后将多个子组件合并成一个组件的“反向”流程去说的。
同时,也能将我们上面理解的“放到components这个变量中”用专业的术语来表达:将子组件注册到静态components对象中。
最后,就是关于js文件顶部的那一行 /** @odoo-module **/,它告诉odoo这个js文件是要翻译成Odoo模块的,这样我们就不用自己写odoo.define了。还有一些特点,后面再学习。
3 一个新的组件Todo
第三个任务是想通过新增一个todo组件来引入props和动态属性。
在count组件那一节,使用的是state。到了这里,使用的是props,<t t-esc="props.id"/>.
当然,这需要在使用todo组件的时候使用属性<Todo id="todo.id" description="todo.description" done="todo.done"/>
官方在对props定义的时候提到props是一个对象,父组件传递个子组件的数据就是通过props。
TIP
至于property和attribute之间的区别,就不在这里探讨了。你要不糊涂,也可以忽略他们之前的区别。
4 Props校验
前面todo组件的props仅仅是满足了使用,这种写法在代码复杂之后,不容器识别todo组件有哪些props,接受什么类型的值。
所以,在todo组件的定义中明确props。参照官方文档,如果将定义中的props中的done这一个属性给删掉,访问页面就报错了。
5 Todo列表
这个任务就比较简单了。就是向todo和playground中间再加一层组件,将todo组件放到TodoList中。
之前Couter和Todo是平级的,现在Todo低一级了。
6 添加todo
Todo列表上方增加一个输入框,所以要更改的是TodoList组件。模板这边就是keyup事件。js这边就是引入了useState,然后就是事件方法。
代码上看不出来使用了什么新的owl框架,但官方希望我们对reactivity有进一步的认知。