1 | <div id="app"> |
在上面的例子中,我们点击按钮,页面上的 price 和 totalPrice 都发生了改变,当我们改变了 price 的值时,Vue 是如何知道需要更新 price,并且依赖 price 的 totalPrice 也同样被更新。
这就是 Vue 的响应式系统发挥的作用。
下面我们将自己实现一个响应式系统,从而了解 Vue 是如何实现这一切的。
人潮散去,瞬间觉醒
1 | <div id="app"> |
在上面的例子中,我们点击按钮,页面上的 price 和 totalPrice 都发生了改变,当我们改变了 price 的值时,Vue 是如何知道需要更新 price,并且依赖 price 的 totalPrice 也同样被更新。
这就是 Vue 的响应式系统发挥的作用。
下面我们将自己实现一个响应式系统,从而了解 Vue 是如何实现这一切的。
前面讲了很多理论知识,现在我们可以开始实战,去自定义一个自己的Widget。
自定义Widget布局肯定需要三个部分:Widget、Element和RenderObject,而核心在于自定义RenderObject。对于单child来说我们可以继承SingleChildRenderObjectWidget
实现,多child Widget一般通过继承MultiChildRenderObjectWidget
和RenderBox
实现,而MultiChildRenderObjectElement
默认不需要自定义,它会负责将MultiChildRenderObjectWidget
和RenderBox
进行关联。
RenderObject如其名字一样,是用来渲染的对象,我们能在屏幕上看到画面,都是通过RenderObject“画”上去的。
通过之前的文章我们知道了Widget、Element、RenderObject之间的关系。
RenderObject在Flutter开发的中后期经常用到,如果想知道一个Widget的实现逻辑,只需要找到Widget的RenderObject实现即可,Flutter中自定义控件实现也绕不过RenderObject。
在Flutter中,最终页面的Layout、Paint等都发生在Widget对应的RenderObject子类中,而RenderObject也是Flutter跨平台最大的特点之一:所有的控件都和平台无关,Flutter只要求系统提供“Canvas”,开发者通过Widget生成的RenderObject“直接”通过引擎绘制到屏幕上
more >>BuildOwner
主要用来管理Element的状态:
通过上一篇的介绍,我们知道了Widget
本质上是UI的配置(静态、不可变),当Widget
被加载时,它的Element
对象首先会被创建,而后充当“大脑”和“仓库”的作用,最后将Widget
的配置信息转化到对应RenderObject
对象内。
Everything is a widget
在flutter中,我们接触最多的东西就是widget,几乎所有的对象都是一个Widget,它不仅可以表示UI元素,也可以表示一些功能性的组件,如用户手势检测的GestureDetector
等。
在flutter开发中,最常用的就是StateflessWidget
和StatefulWidget
了,但是它们只是用来组装控件的容器,那么真正的布局和绘制工作是在哪里完成的呢?
使用flutter到现在也有一年多的时间了,从边学边做开始从开发到维护了一个app项目一年。开始对这一年做一些总结,也在这个过程中发现现有项目的不足。
more >>
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true