render props(vue2.0中的render函数怎么实现双向数据绑定)
本文目录
vue2.0中的render函数怎么实现双向数据绑定
一,先创建一个叫eventbus的vue对象,什么配置都不需要,就只是拿来做一个event bus而已。第二,因为组件的props不允许更改,所以呢要用另一个变量来作为中转,也就是呢,组件不能用functional为true了。然后组件里头定义了个currentValue,绑定在props定义的value,这样:data: function() { return { currentValue: this.value }}第三,组件里头添加watch属性,监听value和currentValue的变化,这样:watch: { value: function(newValue, oldValue) { this.currentValue = newValue; //这里有点诡异,最后说document.getElementById(inputId).value=this.currentValue; }, currentValue: function(newValue){ eventbus.$emit(’model-change’, this.modelName, newValue); }}这里,还需要在props里头加一个modelName的字段给组件标签绑定,后面有用呢。。第四,在input标签里头要绑个input的事件,这样:var that = this;createElement(’input’, { //... ’on’: { ’input’: function(event){ that.currentValue = event.target.value; } }})第五,绑定这个标签的Vue对象里头,要加个created的钩子,绑个model-change的事件,这样:created: function() { var that = this; eventbus.$on(’model-change’, function(modelName, modelValue) { Vue.set(that.$data, modelName, modelValue); });}最终,标签变成了这样:《my-component :value="user.name" model-name="user.name"》《/my-component》user.name的默认值是Mary,渲染出来的时候也是显示Mary,敲键盘改值改成xxx,控制台里头看一下,user.name也变成了xxx了,在控制台里头将user.name改成abc,框里头也变成abc了。终于可以双向绑定了。
关于HOC、RenderProps、Hooks和使用场景
本文会用实际列子对三者进行比较
例子: 现在有两个公共组件,分别是 处理QQ、手机号码的组件。
上面 MyForm 组件使用了 QQ 、 Phone 高阶组件,可以发现以下问题
同样用上面例子
还是上面的例子
HOC 跟 renderProps也有它的存在理由的。 ①.如果组件里面还有其他渲染,不纯粹是处理state的时候可以用HOC。 ②.至于renderProps我举个真实场景,我有很多个按钮,每个按钮点击会打开不同的Dialog。一般做法的,通过定义多个 visible 的state控制Dialog,如下
①.纯粹是复用state,复用多个组件 用 hook 。 ②.使用单个组件,并且组件有自己的渲染内容可以用 HOC 。 ③.状态不需要外部使用而且只用单个组件,可以用 render props 。
(PS:具体问题具体分析,还是要多做比较,书上得来终觉浅 绝知此事要躬行。)
[转]为什么在 React 的 Render 中使用箭头函数和 bind 会造成问题
***隐藏网址***
在 render 中使用箭头函数或绑定会导致子组件重新渲染,即使 state 并没有改变。作者推荐使用提取子组件或在 HTML 元素中传递数据的方式来避免绑定。 这个例子中,我在 render 中使用一个箭头函数来绑定每个删除按钮对应的用户 ID。
点击 CodeSandbox 来查看及演示完整的 demo。(CodeSandbox 很酷,是一个 React 在线器,可以实时编译和展示当前的界面。)
在 35 行中,我使用了一个箭头函数将一个值传递给了 deleteUser 函数,这就是问题的所在。
要查看为什么会这样,先来看看 User.js:
每次 render 调用时,控制台上都会打印日志。User 已经被声明为 PureComponent。所以 User 应该只在 props 或者 state 改变时才会重新 render。但是,当你点击 delete 按钮时, 对于每一个 User 实例,都会调用 render 。
原因在于:父组件在 props 中传递了一个箭头函数。 箭头函数在每次 render 时都会重新分配(和使用 bind 的方式相同) 。所以,尽管我将 User 声明为 PureComponent,User 的父组件中的箭头函数导致 User 组件为所有的用户实例传递了一个新的函数。所以当点击任何删除按钮时,每个用户实例都会重新 render。
结论:
避免在 render 中使用箭头函数和绑定。否则会打破 shouldComponentUpdate 和 PureComponent 的性能优化。
先来看个例子比较一下在 render 中不使用箭头函数的差异。
点击 CodeSandbox 查看和运行完整 demo。
在这个例子中,index.js 的 render 中没有箭头函数了。相关的数据被传到 User.js:
在 User.js 中,onDeleteClick 调用了在 props 中传递的 onClick 函数,并传递了相应的 user.id。
当你再次点击 delete 按钮时,其他的用户再也不会调用 render 了!
为了最佳性能:
React + Redux 性能优化(一):理论篇
本文相关文章:
损失函数曲线(DFSS培训咨询中的质量损失函数和质量特性波动有什么关系)
2024年9月30日 16:45
求解:db2 length函数疑问?winrar64位如何破解我是在他的官网下载的
2024年9月30日 10:25
phpforeach(PHP 关于foreach函数的问题)
2024年9月30日 09:10
matlab求二元函数最小值(怎么用matlab求R内的二元函数最小值啊 可能是近似)
2024年9月29日 23:10
matlab二元隐函数绘图(matlab 隐函数求解以及绘图)
2024年9月29日 20:40
column函数的使用(EXCEL中“column”函数和“MOD”函数的用法)
2024年9月29日 04:40
replicate函数(基于python的opencv学习——copyMakeBorder()函数)
2024年9月28日 08:15
mysql查询大于某个日期(如何利用MySQL函数查询特定的日期时间)
2024年9月27日 20:30
evaluate为什么出不来结果(为什么这个有的可以出结果,有的却不能呢我套用的是=evaluate()函数求高人指点呀谢谢了)
2024年9月27日 03:45
cesium的datasource(Cesium快速上手9-Camera和Scene中的其他函数使用)
2024年9月9日 18:01
day函数是什么意思(函数DAY($A$3)*4-4 代表什么意思)
2024年9月8日 10:45
递归算法解决八皇后问题(用递归函数设计八皇后问题的回溯算法C++代码)
2024年9月8日 09:01
c语言lseek函数的用法(问一个关于lseek函数的效率问题)
2024年9月7日 14:45
python递归函数考试题(python题目:要求用递归、递推和Lambda三种方式编写power(n,x)函数)
2024年9月6日 03:40
更多文章:
html5模板简单css(会CSS的来,有偿请人写一个简单的html5页面,有样图)
2024年7月13日 05:44
二进制转换十进制(111001)2 ( )10(二进制如何转换是十进制)
2024年6月29日 18:07
零基础 python处理excel数据(Python怎么处理Excel数据)
2024年8月13日 18:35
vb中tooltip控件用法(vb tooltiptext怎么用啊)
2024年5月11日 13:45
discuz开放平台(请问下我现在网站Discuz系统 能不能实现开放平台啊)
2024年3月24日 15:35
h5神兽平台正规的代理(大厂注册公司代理公司(河北大厂注册公司流程))
2024年8月11日 19:16
新冠疫情防控系列长图发布(疫情防控动画手抄报 手抄报简单又好看)
2024年3月18日 22:15
java开发环境下载(开始用java怎么下载安装开发环境、设置变量等等,有完整详细的步骤吗谢谢啦!)
2024年6月8日 13:10
oracle怎么解锁用户(the account is locked怎么解决)
2024年7月18日 16:16