VPS参考测评推荐
专注分享VPS主机优惠信息
衡天云优惠活动
华纳云优惠活动
荫云优惠活动

如何实现微信小程序的双向数据绑定(微信小程序和vue的双向数据绑定区别在哪里)

主机参考:VPS测评参考推荐/专注分享VPS服务器优惠信息!若您是商家可以在本站进行投稿,查看详情!此外我们还提供软文收录、PayPal代付、广告赞助等服务,查看详情!
我们发布的部分优惠活动文章可能存在时效性,购买时建议在本站搜索商家名称可查看相关文章充分了解该商家!若非中文页面可使用Edge浏览器同步翻译!PayPal代付/收录合作

原生小程序开发中,数据流是单向的,不能双向绑定,但是实现双向绑定的功能还是挺简单的!

以下是小程序框架minapp中实现双向绑定的原理。在minapp中,您只需要添加。同步到wxml模板中组件的属性名,实现双向绑定。为了解释其原理,过程可能会稍微复杂一点,但实际上,minapp框架已经处理了那些复杂的细节!

首先,为了在两个方向上绑定数据,应该避免太多的数据源。在自上而下的自然数据流的情况下,如果每个组件都维护自己的数据并保持它们的数据值一致,尽管可以做到这一点,但实现过程不会简单。但是,不必说为了有一个统一的数据源,使用mobx或redux来全局管理数据,这有点像杀鸡。因为双向绑定只存在于父组件和子组件之间,并且数据是从父组件传输到子组件的,所以父组件中的数据可以首先用作数据源。子组件每次更新数据时,并不更新自己的内部数据,而是通过事件机制触发父组件更新其数据,父组件更新数据后自然会将更新的数据传输给子组件,从而实现数据的双向流动!

data-stream

并非所有数据都需要双向绑定,也并非所有数据都是外部数据。子组件也可以有自己的内部数据。所以这就涉及到我们要讲的第二个问题:区分哪些数据需要双向绑定,哪些数据需要由子组件自己维护。

使用过vue的人都应该知道,要在vue中实现双向绑定,需要在模板中进行特殊处理。例如,要将父组件的parentAttr绑定到子组件的childAttr,您需要在父组件的模板中编写以下内容:

& ltchild childAttr.sync = & quotparentAttr&quot/& gt;然而,小程序没有这么简单的语法,甚至没有字符“。”不允许在applet的wxml语言的属性名中使用。回到我们的问题,子组件需要知道哪些属性需要双向绑定,哪些属性需要自己维护。只需在模板中添加一个字段(syncAttrMap)来告诉子组件需要双向绑定的数据集。比如上面的例子可以写成微信小程序支持的写作:

& ltchildAttr = & quot{ { parentAttr } } & quotsyncAttrMap = & quotchildAttr = parentAttr & quot/& gt;& lt!--如果同时存在多个双向绑定和不需要双向绑定的属性,可以这样写:P1 p1、p2分别绑定到子组件的C1 c1、c2,p3单向绑定到C3 --》;& lt子c1 = & quot{ { p1 } } & quotc2 = & quot{ { p2 } } & quotc3 = & quot{ { p3 } } & quotsyncAttrMap = & quotc1 = p1 & ampc2 = p2 & quot/& gt;然后,需要处理子组件的数据更新问题。子组件中有两部分数据,一部分是内部数据,另一部分是父组件中的数据。子组件可以通过读取syncAttrMap属性来获取哪些数据是内部数据,哪些数据是父组件的数据,并且它们可以知道相应父组件中数据的键名是什么。因为原生组件方法setData不管你是内部数据还是父组件中的数据,只要你调用它更新数据,它只会更新内部数据。因此,需要实现一种新的方法来自动判断数据源,如果是内部数据,则直接调用setdata如果是双向绑定中父组件的数据,可以触发一个事件来通知父组件更新相应的值。

所以根据上面的描述,父组件需要具有侦听功能,子组件需要具有智能setData功能。如果父组件的监视函数名为onSyncAttrUpdate,子组件的智能setData函数名为setDataSmart,则可以有以下代码:

//父组件({ methods:{ onsynccatupdate(e){ this . setdata(e . detail)//需要从子组件中更新的数据}})《!--父组件--》的模板;& ltchildAttr = & quot{ { parentAttr } } & quotsyncAttrMap = & quotchildAttr = parentAttr & quotbind:syncAttrUpdate = & quot;onsynccattrupdate & quot;/& gt;//当子组件组件({properties: {childattr: string,syncattrmap: string},methods:{//子组件更新数据时,只需调用此方法。而不是“setData”setData smart(data){//splitDataBySyncAttrMap函数,我们不讨论它,只拆分对象,每个人都应该可以实现let {parentData,inner data } = splitdatabysynccattrmap(data,this . data . syncattrmap)//内部数据用setData if(object . keys(inner data)更新。length){ this . SetData(innerdata)//SetData也支持回调回调。为了简化代码,这里不讨论父组件的}//双向绑定的数据触发事件。让父组件更新if(对象。密钥(parentdata)。长度){this。自行触发事件(syncattrupdate,parent data)} }),一个简单的双向绑定函数就完成了。但是,由于子组件还可能包含其他组件,也就是说子组件也可以是父组件,父组件也可以是子组件。因此,上述onSyncAttrUpdate setDataSmart函数需要在每个组件中实现,因此没有必要定义一个公共对象BaseComponent来实现上述所有功能,例如:

//base component const base component = { properties:{ syncAttrMap:String },methods:{ setDataSmart(){//...},onsynccatupdate(){/...}}然后将BaseComponent minin添加到每个组件的对象。此外,小程序中还有一个特殊的组件:页面。虽然Page和component的结构不同,但也应视为组件,但它必须是父组件,不能是其他组件的子组件,因此需要在所有页面定义中编写onSyncAttrUpdate方法。所有这些都是minapp双向绑定的基本原则。

等等,最后一件事:wxml模板,不能让用户每次写双向绑定时都写这么复杂的语句吧?当然不是。minapp将在编译时对模板进行简单转换:

& ltchild childAttr.sync = & quotparentAttr&quot/& gt;& lt!--因为属性名syncAttrMap是固定的,所以完全可以将上面的模板转换为下面的模板--》;& ltchildAttr = & quot{ { parentAttr } } & quotsyncAttrMap = & quotchildAttr = parentAttr & quot/& gt;谢谢大家,文章到此结束。欢迎来到minapp:重新定义微信小程序的发展。

我相信你看完这个案例后已经掌握了方法。更多精彩请关注主机参考其他相关文章!

推荐阅读:

事件模型的详细说明

如何使用事件循环

以上就是微信小程序如何实现双向数据绑定的细节。更多资讯请关注主机参考其他相关文章!

这几篇文章你可能也喜欢:

本文由主机参考刊发,转载请注明:如何实现微信小程序的双向数据绑定(微信小程序和vue的双向数据绑定区别在哪里) https://zhujicankao.com/105587.html

【腾讯云】领8888元采购礼包,抢爆款云服务器 每月 9元起,个人开发者加享折上折!
打赏
转载请注明原文链接:主机参考 » 如何实现微信小程序的双向数据绑定(微信小程序和vue的双向数据绑定区别在哪里)
主机参考仅做资料收集,不对商家任何信息及交易做信用担保,购买前请注意风险,有交易纠纷请自行解决!请查阅:特别声明

评论 抢沙发

评论前必须登录!