前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >微信小程序中 setData 详解

微信小程序中 setData 详解

作者头像
itclanCoder
发布于 2020-10-28 08:52:12
发布于 2020-10-28 08:52:12
2.5K00
代码可运行
举报
文章被收录于专栏:itclanCoderitclanCoder
运行总次数:0
代码可运行

作者 | 随笔川迹

ID | suibichuanji

前言

撰文:川川

小程序中各个页面之间是相互独立的,一个页面分为渲染层(视图层 webview),逻辑层(JavaScript),系统层(底层)

在架构上,WebViewJavascriptCore 都是独立的模块,并不具备数据直接共享的通道

换而言之,若要将逻辑层中的data的数据渲染到页面中,他们之间是无法直接通信的,往往需要系统层作为中间角色

我们都知道视图层的数据来源于逻辑层 data,而视图图层若想要改变逻辑层 data 的数据,需要借助setData这个方法去触发,以达到更新视图层的数据,具体的工作过程是怎么样的?

· 正 · 文 · 来 · 啦 ·

01

setData是什么?

定义: 设置数据,更改数据

作用: setData函数用于将数据从逻辑层发送到视图层(异步),同时改变对应的 this.data的值(同步)

仔细细品这句话,会包含了很多信息

  • setData它是微信小程序提供的一个内置的接口,是用于改变逻辑层中 data下的数据的
  • 视图层 view的数据挂载在逻辑层的 data下,发送到视图层中是异步的
  • 改变 this.data是同步,换句话说,若直接修改 this.data 而不调用 this.setData方法,是无法改变页面的状态的,还会造成数据不一致

从上面的这张图中就可以看到,当逻辑层data数据渲染到界面的时候,逻辑层的数据需要经过系统层,当系统层接收到这个逻辑层的数据后

系统层在把数据转发给渲染层,然后在渲染层展示出来,在这个过程当中是异步的

视图层和逻辑层的数据传输,实际上通过两边提供的 JavScript Core所实现,即用户传输的数据,需要将其转换为字符串形式传递

同时把转换后的数据内容拼接成一份 JS 脚本,再通过执行 JS 脚本的形式传递到两边独立的环境

02

setData两个重要的参数

从官方文档中看到这句Page.prototype.setData(Object data, Function callback),得知,setData方法是挂载当前页面实例Page原型下一个公用实例方法

也就是说,Page 下面的任何一个方法内,都可以使用 setData 方法,它接收两个参数

  • 一个是Object data,第一个参数Object data是必传的,数据类型是Object,所代表的含义是,这次要改变的数据
  • 而第二个参数Function callback回调函数是非必填的,它所代表的含义是,setData引起的界面更新渲染完毕后的回调函数

为了便于理解,在小程序中创建一个 page 页面,名为setdata,如下是逻辑层 js 文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// miniprogram/pages/setdata/setdata.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    name: "itclanCoder"
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {

  }
})

而 wxml 文件如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--miniprogram/pages/setdata/setdata.wxml-->
<text>{{name}}</text>

在Web 开发中,开发者使用JavaScript通过Dom接口来完成界面的实时更新。而在小程序中,使用WXML语言所提供的数据绑定功能,来完成此项功能

在小程序中是没有DOM,BOM的那一套东西的,没有document.getElementById等的

小程序是数据驱动视图的,逻辑层中的 data 数据改变了,视图层 view 也会跟着改变,它是单向数据流的,如果想要触发视图中数据的更新,那么就需要借助setData这个方法

上面的WXML通过{{变量名}}来绑定 WXML文件和对应的JavaScript文件中的data对象属性

在上面的示例中,页面会显示itclanCoder,那如何更改逻辑层的数据呢

在下面的示例中,演示了如何更改逻辑层的数据,在 wxml 中新增了一个按钮,用bindtap绑定了一个handleChangeName方法,触发按钮,改变 data 下的数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--miniprogram/pages/setdata/setdata.wxml-->
<text>{{name}}</text>
<button type="primary" bindtap="handleChangeName">更改data中数据</button>

而在逻辑层 JS

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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字段值,使用的是setData方法,这个方法接收了一个参数,第一个参数是对象,这个Object 以 key: value 的形式表示,将 this.data中的 key对应的值改变成 value

注意

这个key可以以数据路径的形式给出,支持改变数组中的某一项或对象的某个属性,如 array[2].message,a.b.c.d,并且不需要在 this.data中预先定义,但凡是页面要显示的变量数据,最好先挂载在data下初始化定义,然后在使用

也就是说在更改setData下的变量时,直接写key名就可以了的,不用写this.data.属性,如下所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
this.setData({
   // this.data.name: "川川" // 这样写是会报错的
   name: "川川"               // 正确的写法
})

而setData接收第二个参数,是一个Function callback

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
handleChangeName() {
    console.log("name开始的数据", this.data.name); // itclanCoder
    this.setData({
      name: "川川"
    }, () => { // 接收第二个回调函数
       console.log("执行setData引起的界面更新渲染完毕后的回调函数");
    })
    console.log("name经过setData后的数据", this.data.name); // 川川
  }

上面代码的执行顺序是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
itclancoder
川川
执行setData引起的界面更新渲染完毕后的回调函数

此结果说明这个setData方法是异步的,等待主线程任务做完了,然后在去执行第二个参数,回调异步函数

03

如何更改某个对象下的属性

有时候,我们的接口数据类型是对象,并非是基本数据类型(number,boolean,string,null),但由于业务需求,我们往往需要改变对象下的某个属性

如下所示,我想改变person下的 age 属性值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// miniprogram/pages/setdata/setdata.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    person: {
      name: "随笔川迹",
      sex: "男神",
      age: 20
    }
  },

  handleChangeName() {
    this.setData({
      person: {
        age: 24
      }
    })
  }
})

在上面的代码中,的确可以更改person对象下的age属性,但是随之带来的问题是,person对象下除了age属性,其他属性都消失了

这非常令人郁闷

那如何解决这个问题?

  • 方法 1: 指明具体的修改对象属性
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
this.setData({
   "person.age": 24  // 注意要用双引号或单引号将属性给引起来
})
  • 方法 2:使用中扩号['对象.属性']:属性值
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
this.setData({
   ['person.age']: "川川"   // 访问对象下的属性可以用.也可以用中括号,中间代表是一个变量,需要用引号引起来
})

如下所示

这个在以后的开发中,很有用,有时候,在需要更改对象下的某个属性值的时候,就可以使用这种方式

04

setData注意事项

  • 直接修改 this.data,而不调用this.setData是无法改变页面的状态的,还会造成数据不一致
  • 仅支持设置可JSON化的数据,如果不是 JSON 对象数据格式,需要将数据进行转化成json对象`,key:value形式
  • 单次设置的数据不能超过1024kB(1M),不要一次设置过多的数据(由于小程序运行逻辑线程与渲染线程之上,setData的调用会把数据从逻辑层传到渲染层,数据太大会增加通信时间,会增加脚本的编译执行时间,占用 WebView JS 线程,)
  • 不要把 data中任何一项的value设为undefined,否则这一项将不被设置并可能遗留一些潜在问题
  • 页面中需要显示的数据,可以挂载在data下面初始化,虽然这个值不一定要先设置,但是建议先声明然后在使用
  • 避免setData的调用过于频繁(setData接口的调用涉及逻辑层与渲染层间的线程通信,通信过于频繁可能导致处理队列阻塞,界面渲染不及时而导致卡顿,应避免无用的频繁调用)
  • Android下用户在滑动时会感觉到卡顿,操作反馈延迟严重,因为JS线程一直在编译执行渲染,未能及时将用户操作事件传递到逻辑层,逻辑层亦无法及时将操作处理结果及时传递到视图层
  • 渲染有出现延时,由于WebView的 JS 线程一直处于忙碌状态,所以,逻辑层到页面层的通信耗时上升,视图层收到的数据消息时距离发出时间已经过去了几百毫秒,渲染的结果并不是实时的
  • 避免 setData 数据冗余(setData操作会引起框架处理一些渲染界面相关的工作,避免将未绑定在 WXML 的变量传入setData,减少不必要的性能消耗)
  • 后台态页面进行setData(比如退出小程序),当页面进入后台态(用户不可见),不应该继续去进行 setData,后台态页面的渲染用户是无法感受到的,另外后台态页面去 setData 也会抢占前台页面的执行

结语

在本文中主要介绍了下setData的使用,它是用于修改挂载在 data 下面的数据的,当想要修改视图 view,那么需要借助 setData 函数,它接收两个参数,第一个参数时必传的,也就是要修改视图 view 层的对象,而第二个参数时非必传的

setData 将数据从逻辑层发送到视图层是异步,同时改变对应的this.data的值是同步,它并不是实时的,这也导致了必须要考虑性能的因素

从而介绍了 setData 的使用注意事项,值得注意的是,如何修改对象下的某个属性,这个在往后的开发中,是使用比较频繁的.

如果小伙伴们有问题,欢迎大家下面留言,一起学习讨论

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 itclanCoder 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
使用腾讯元宝+markmap生成思维导图
AI可以帮助我们进行提炼和总结, 节省了大量搜索资料和查阅的时间,像上图这张思维导图,就是使用腾讯元宝大模型进行内容提炼,再使用markmap生成思维导图,下面讲解下详细实现步骤:
用户6874993
2024/06/13
5300
使用腾讯元宝+markmap生成思维导图
DeepSeek+Xmind一键生成思维导图
我们工作和生活中,有时候遇到一本好书或者是别人写的一些比较有深度的文章,认真看完要花不少时间。
SQL数据库开发
2025/03/03
3970
DeepSeek+Xmind一键生成思维导图
【愚公系列】《高效使用DeepSeek》017-知识点思维导图生成
📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主!
愚公搬代码
2025/03/26
1800
使用Kimi+Markmap总结网页内容生成思维导图
AI可以帮助我们更高效地阅读文章进行提炼总结,像上图这张思维导图,就是使用Kimi进行内容提炼,再使用markmap生成思维导图,下面讲解下详细实现步骤:
用户6874993
2024/06/10
5650
使用Kimi+Markmap总结网页内容生成思维导图
用 Markdown 写思维导图?Markmap 让你的想法“动”起来!
你是否曾为如何将零散的思绪整理成清晰的逻辑框架而苦恼?你是否在寻找一种既能保持文字的简洁,又能直观呈现信息关系的工具?今天,我要给大家介绍一个宝藏工具——Markmap。它能将 Markdown 格式的文字瞬间转化为可交互的思维导图,让你的思维不仅有条理,还能“动”起来!
程序那些事儿
2025/03/03
8280
用 Markdown 写思维导图?Markmap 让你的想法“动”起来!
DeepSeek + Xmind,1分钟自动把pdf/word文档转成思维导图
DeepSeek加Xmind,1分钟把PDF、Word文档转成思维导图!步骤超简单:
基于deepseek的呼叫中心
2025/03/09
5720
用 Markdown 生成思维导图,这款神器太牛了!
相信应该有很多伙伴们现在都在使用 Markdown 吧,它可以让我们专注码字的同时还能兼顾排版,体验非常好。
永恒君
2023/02/20
11K1
用 Markdown 生成思维导图,这款神器太牛了!
太牛逼了,Markdown 几行字符就可以生成思维导图了!
刚开始的文章排版很乱,Markdown 编辑器这东西也从来没听说过,随着时间的流逝,认识了业界内的大佬,从中吸取了经验,后来我才开始逐步抛弃富文本编辑器,拥抱 Markdown 编辑器。
杰哥的IT之旅
2020/06/18
4.6K0
AI科普文章 | 语音识别准不准?—— ASR 效果评测原理与实践
在日常工作、生活中,语音识别技术作为基础服务,越来越多的出现在我们周围,比如智能音箱、会议记录、字幕生成等等。
腾讯云AI
2023/01/04
5.8K0
AI科普文章 | 语音识别准不准?—— ASR 效果评测原理与实践
15款最好用的思维导图工具
今天给大家推荐15个常用的思维导图软件,帮助大家更快捷的完成工作,简化工作工作流程,非常的实用。 思维导图也叫心智图,是一项流行的全脑式学习方法,用来表示词,思路,任务或其他与围绕着一个中央关键词或想法项目的示意图。通过径向,图形和非线性的方式提出意见,思维导图鼓励头脑风暴的方法来规划和组织任务。虽然思维导图的分支表示分层树形结构,其放射状排列扰乱通常与呈现更加线性的视觉线索层次相关概念的优先次序。 在这里,我们选择了一些最好的思维导图工具,让您能够快速探索思路,与同事协作和编辑你的内容。下面的大多数工具是
机器学习AI算法工程
2018/03/09
15.9K1
15款最好用的思维导图工具
我开源了一个思维导图
我对思维导图最初的了解来源于我的老婆,她很喜欢用思维导图来记录各种东西,看的多了,作为一个前端,就会好奇这东西是怎么实现的,于是我在网上搜了一下,看到了一篇介绍思维导图基本结构--逻辑结构图的一种布局算法,然后我就想,布局算法有了,我再实现一下节点内容渲染、节点连线、展开收起、编辑之类的功能不就可以实现一个简单的思维导图了么,顺便还可以产出一篇文章,是的,能写文章是我做这个的最大动力。
街角小林
2023/08/16
1.2K3
我开源了一个思维导图
ChatGPT结合Xmind生成思维导图
除了ChatGPT结合MINDSHOW自动生成PPT外,是否可以在一些场景下,借助ChatGPT快速生成思维导图呢?
朱季谦
2023/12/25
5510
看我用ChatGPT如何快速生成思维导图
把这些内容复制到支持MarkDown格式的编辑器,如果你没有这样的编辑器也没关系,你用文本文件保存复制来的内容,然后把文件后缀改成.md比如我的文件是:智能手机.md。
张俊红
2023/08/08
6160
看我用ChatGPT如何快速生成思维导图
使用ChatGPT生成思维导图
在当今信息爆炸的时代,我们经常需要整理和梳理大量的信息,思维导图是一个非常强大的工具,可以帮助我们更好地理清思路。那么,有没有一种简单而高效的方式,通过一键操作就能生成思维导图呢?在本文中,我们将介绍如何利用ChatGPT和Xmind来实现这一愿景。
人不走空
2024/02/21
4600
使用ChatGPT生成思维导图
ChatGPT + MarkMap,一分钟生成你的思维导图
思维导图是一种常用的视觉工具,用于整理和表达思维过程、概念和信息之间的关系。它具有广泛的应用,为我们在日常生活中的学习、工作和组织思考提供了有力的支持。通过以中心主题为核心,将相关的想法、观点和任务以分支的形式展开,思维导图可以帮助我们更清晰地理解、记忆和组织复杂的信息。 在工作中,我们多多少少会有时候需要制作思维导图。一般会采用XMind或者其它类似的软件来制作。 今天我就来分享一个快速制作思维导图的办法。主角就是ChatGPT + markmap
huolong
2023/08/18
2.7K1
ChatGPT + MarkMap,一分钟生成你的思维导图
AI绘制思维导图:使用SpringBoot和Vue实现智能可视化
在当今快节奏、信息量巨大的社会中,有效地组织和呈现信息变得至关重要。思维导图作为一种强大的视觉工具,能够帮助我们捕捉、整理和分析复杂信息,从而提高工作效率和创造力。本文将探讨如何利用人工智能(AI)技术来增强思维导图的绘制过程,并介绍一个具体的实现案例,该案例使用SpringBoot作为后端框架,Vue.js作为前端框架,共同构建一个智能思维导图绘制系统。
正在走向自律
2024/12/18
6970
AI绘制思维导图:使用SpringBoot和Vue实现智能可视化
markmap 核心原理解析
Markmap 是一个非常有用的工具,它可以将 Markdown 文本转换成交互式的思维导图,我在工作中经常会用到这个工具,比如:
老码小张
2023/11/29
1.8K0
markmap 核心原理解析
软件测试/人工智能|思维导图很难画,ChatGPT来帮你
在我们日常的软件测试工作中,测试用例是非常重要的一环,但是很多时候我们并不是第一时间就设计测试用例的,我们会先根据需求先制定一个思维导图,后面再去设计我们的测试用例,有的公司更是会通过思维导图来设计测试用例的。本文就来给大家介绍一下如何使用ChatGPT来生成思维导图。
霍格沃兹测试开发Muller老师
2023/11/21
3090
软件测试|如何使用ChatGPT生成思维导图
思维导图是一种用图形方式呈现信息、概念和关系的工具,旨在帮助人们更清晰地组织、理解和记忆复杂的信息。它通常以树状结构展示,将主题、子主题、关键词等通过线条和连接箭头相连,从而呈现出不同元素之间的层次关系和联系。
霍格沃兹测试开发Muller老师
2023/08/22
4300
12种思维导图工具,助你成为结构化思维专家
“如果我们任命你为店长,去管理经营状况最糟糕的一个店面。那么,在经营这家店时,你会考虑哪些方面?你要做什么去改变当前糟糕的局面呢?” 花几分钟好好考虑一下这个问题吧。在纸上写下一些你考虑的事情,然后我们继续往下看。 你觉得这个练习怎么样?难不难?你确定你已经写下了所有可能的方面了吗? 如果你不确定你已经想得很全面,或者你的列表看上去只是一个待办清单,没有任何框架或者结构,那么这篇文章将在很大程度上给你提供帮助。 结构化思维的重要性 每个人都有能力在同一时间思考多方面的问题。但是,数据科学家的特别之处在于他们
钱塘数据
2018/03/05
1.6K0
12种思维导图工具,助你成为结构化思维专家
推荐阅读
相关推荐
使用腾讯元宝+markmap生成思维导图
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档