Skip to content

第一章 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有进一步的认知。

7 输入焦点

8 折叠todos

9 删除todo

10 带插槽的通过组件

11 小零碎