明星公众号(ID:)
如果你不知道如何操作
点击这里,
━━━━━━
━━━━━━
我希望你保持杯子空着
边读边思考
更重要的是,你需要敲
如果你有三连击
作者 | 论文
ID|
前言
撰文:川川
在小程序中,各个页面都是相互独立的,一个页面分为渲染层(视图层)、逻辑层()、系统层(底层)
从架构上来说, 和 都是独立的模块,并没有直接的数据共享通道。
也就是说,如果要将逻辑层的数据渲染到页面中,他们之间不能直接通信,往往需要通过系统层作为中介。
我们都知道视图层的数据来自于逻辑层的数据,如果视图层想要改变逻辑层的数据,就需要使用这个方法来触发,才能更新视图层的数据,那么具体的工作流程是怎样的呢?
· 文章正在更新 ·
01
它是什么?
定义:设置数据,改变数据
功能:该函数用于将数据从逻辑层发送到视图层(异步),并改变this.data对应值(同步)
如果你仔细看这句话,你会发现它包含了很多信息。
从上图可以看出,逻辑层的数据在渲染到界面时,逻辑层的数据需要经过系统层。
系统层将数据转发给渲染层,然后在渲染层进行显示,这个过程是异步的。
视图层与逻辑层之间的数据传输其实是通过双方提供的Core来实现的,也就是需要将用户传递过来的数据转换成字符串形式进行传输
同时将转换后的数据内容拼接成JS脚本,然后通过执行JS脚本传输到双方独立的环境中。
02
两个重要参数
从官方文档中看到这句话Page..(data,),得知该方法是挂载当前页面实例Page原型的下一个公共实例方法
也就是说,在Page下的任意方法中,都可以使用该方法,该方法接收两个参数
为了方便理解,在小程序中创建一个页面命名,下面是逻辑层js文件
// miniprogram/pages/setdata/setdata.js Page({ /** * 页面的初始数据 */ data: { name: "itclanCoder" }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { } })
wxml文件如下
{{name}}
在Web开发中,开发者通过DOM接口完成界面的实时更新,在小程序中则是利用WXML语言提供的数据绑定功能来完成这一功能。
小程序中不存在DOM、BOM等。
小程序是数据驱动的,逻辑层的数据发生变化,视图层也会随之变化,是单向的数据流,如果想触发视图中数据的更新,就需要使用这种方式。
上面的WXML使用{{变量名}}来绑定WXML文件和对应文件中的数据对象属性。
在上面的例子中,页面将显示如何在逻辑层中改变数据?
下面的例子演示了如何在逻辑层改变数据,在wxml中添加一个按钮,并绑定一个方法触发按钮去改变data下的数据。
{{name}} 更改data中数据
并在逻辑层JS
// miniprogram/pages/setdata/setdata.js Page({ /** * 页面的初始数据 */ data: { name: "itclanCoder" }, // 改变data的方法 handleChangeName() { console.log("name开始的数据", this.data.name); // itclanCoder this.setData({ name: "川川" }) console.log("name经过setData后的数据", this.data.name); // 川川 } })
上述示例代码中,通过一个方法修改了data下的name字段值,该方法接收一个参数,第一个参数是一个对象,以key:的形式表示,将this.data中key对应的值修改为
注意
这个key可以以data路径的形式给出,支持改变数组中的某一项或者某个对象的某个属性,比如[2].abcd,不需要预先定义在this.data中。但是对于任何需要在页面展示的变量数据,最好都挂载到data下并初始化,然后再使用。
也就是说改变变量的时候,只写键名,不用写this.data.属性,如下图
this.setData({ // this.data.name: "川川" // 这样写是会报错的 name: "川川" // 正确的写法 })
接收第二个参数是
handleChangeName() { console.log("name开始的数据", this.data.name); // itclanCoder this.setData({ name: "川川" }, () => { // 接收第二个回调函数 console.log("执行setData引起的界面更新渲染完毕后的回调函数"); }) console.log("name经过setData后的数据", this.data.name); // 川川 }
上述代码的执行顺序是
itclancoder 川川 执行setData引起的界面更新渲染完毕后的回调函数
这个结果说明这个方法是异步的,等待主线程任务完成后,再执行第二个参数回调异步函数
03
如何改变对象的属性
有时候,我们的接口数据类型是对象,而不是基本数据类型(,,,null),但是由于业务需要,我们经常需要改变对象下的某个属性
如下所示我想改变age属性值
// miniprogram/pages/setdata/setdata.js Page({ /** * 页面的初始数据 */ data: { person: { name: "随笔川迹", sex: "男神", age: 20 } }, handleChangeName() { this.setData({ person: { age: 24 } }) } })
上述代码中,对象的age属性确实是可以改变的,但是随之而来的问题是,除了age属性之外,对象的其它属性全部消失。
这很令人沮丧
那么我们该如何解决这个问题呢?
this.setData({ "person.age": 24 // 注意要用双引号或单引号将属性给引起来 })
this.setData({ ['person.age']: "川川" // 访问对象下的属性可以用.也可以用中括号,中间代表是一个变量,需要用引号引起来 })
如下
这个在以后的开发中很有用,有时候需要改变某个对象下某个属性的值的时候,就可以使用这个方法。
04
防范措施
结论
本文主要介绍下面的使用,该函数用于修改挂载在data下的数据。当想要修改view视图的时候,需要使用该函数,该函数接收两个参数,第一个参数是必须的,也就是需要修改的view层的对象,第二个参数是可选的。
从逻辑层向视图层发送数据是异步的,而改变对应的this.data值却是同步的,并不是实时的,这也导致需要考虑性能的因素。
至此,使用注意事项就介绍完了,值得注意的是,如何修改某个对象下的某个属性,在以后的开发中会用到比较多。
如果还有疑问的话可以在下方留言,一起学习讨论。
这个世界很酷
遇见你是缘分
失去朋友是生活的正常部分
偶尔能说话
但心还是温柔的
好朋友们
我希望你就是我的朋友
等待一整天
看我写,听我读
继续给川川竖起大拇指
年轻人,愿你
无惧风雨 继续前行
听川川,令人心潮澎湃
看看川川,怀孕在代码里
读川川,我有很多感想
写川川,刻在我心上
公众号(ID:)
代码能让你早日摆脱蔬菜类,写作能帮你洗去铅华