vue数据不响应,可能是用法有问题
<template>
<div>
<div>
<span>用户名: {{ userInfo.name }}</span>
<span>用户性别: {{ userInfo.sex }}</span>
<span v-if="userInfo.officialAccount">
公众号: {{ userInfo.officialAccount }}
</span>
</div>
<button @click="handleAddOfficialAccount">添加公众号</button>
</div>
</template>
<script>
export default {
data() {
return {
userInfo: {
name: '子君',
sex: '男'
}
}
},
methods: {
// 在这里添加用户的公众号
handleAddOfficialAccount() {
this.userInfo.officialAccount = '前端有的玩'
}
}
}
</script>
但是通过this.userInfo.officialAccount = '前端有的玩'
添加之后,并没有生效,这是为什么呢?
这是因为在Vue内部,
数据响应是通过使用Object.definePrototype监听对象的每一个键的getter,然后通过setter方法来实现的,
但通过这种方法只能监听到已有属性,新增的属性是无法监听到的,
但我就是想监听,咋办????。下面小编提供了四种方式,如果有更多方式,欢迎下方评论区告诉我。
方法一
data() {
return {
userInfo: {
name: '子君',
sex: '男',
// 我先提前定义好
officialAccount: '',//新增
}
}
}
方法二
其实上面这方法都有点取巧的嫌疑,
其实对于新增属性,
Vue官方专门提供了一个新的方法Vue.set用来解决【新增属性】无法触发数据响应
但是每次要用到set方法的时候,还要把Vue引入进来,
好麻烦,所以为了简便起见,
Vue又将set方法挂载到了Vue的原型链上了,
即Vue.prototype.$set = Vue.set,
所以在Vue组件内部可以直接使用this.$set代替Vue.set
this.$set(this.userInfo,'officialAccount', '前端有的玩')
许多同学不知道什么时候应该用Vue.set,
其实只有当你要赋值的属性还没有定义的时候需要使用Vue,set,其他时候一般不会需要使用。
方法三
我觉得$forceUpdate的存在,
让许多前端开发者不会再去注意数据双向绑定的原理,
因为不论什么时候,
反正我修改了data之后,
调用一下$forceUpdate就会让Vue组件重新渲染,bug是不会存在的。
但是实际上这个方法并不建议使用,
因为它会引起许多不必要的性能消耗。
针对数组的特定方式
其实不仅仅是对象,数组也存在数据修改之后不响应的情况,比如下面这段代码
<template>
<div>
<ul>
<li v-for="item in list" :key="item">
{{ item }}
</li>
</ul>
<button @click="handleChangeName">修改名称</button>
</div>
</template>
<script>
export default {
data() {
return {
list: ['张三', '李四']
}
},
methods: {
// 修改用户名称
handleChangeName() {
this.list[0] = '王五'
}
}
}
</script>
上面的代码希望将张三的名字修改为王五,实际上这个修改并不能生效,这是因为Vue不能检测到以下变动的数组:
当你利用索引直接设置一个项时,
例如: this.list[index] = newValue修改数组的length属性,例如: this.list.length = 0
所以在上例中通过this.list[0] = '王五' 是无法触发数据响应的,那应该怎么办呢?
像上面提到的Vue.set和$forceUpdate都可以解决这个问题,比如Vue.set可以这样写
Vue.set(this.list,0,'王五')
在操作数组的时候,
我们一般会用到数据提供的许多方法,
比如push,pop,splice等等,
在Vue中调用数组上面提供的这些方法修改数组的值是可以触发数据响应的,
比如上面的代码改为以下代码即可触发数据响应
this.list.splice(0,1,'王五')
实际上,
如果Vue仅仅依赖getter与setter,
是无法做到在数组调用push,pop等方法时候触发数据响应的,
因此Vue实际上是通过劫持这些方法,
对这些方法进行包装变异来实现的。
Vue对数组的以下方法进行的包装变异:
push
pop
shift
unshift
splice
sort
reverse
原地址:掘金:https://juejin.im/post/6854573211422572557
vue数据不响应,可能是用法有问题的更多相关文章
- vue 数据劫持 响应式原理 Observer Dep Watcher
1.vue响应式原理流程图概览 2.具体流程 (1)vue示例初始化(源码位于instance/index.js) import { initMixin } from './init' import ...
- VUE 数据请求和响应(axios)
1. 概述 1.1 简介 axios是一个基于Promise(本机支持ES6 Promise实现) 的HTTP库,用于浏览器和 nodejs 的 HTTP 客户端.具有以下特征: 从浏览器中创建 XM ...
- 由自定义事件到vue数据响应
前言 除了大家经常提到的自定义事件之外,浏览器本身也支持我们自定义事件,我们常说的自定义事件一般用于项目中的一些通知机制.最近正好看到了这部分,就一起看了下自定义事件不同的实现,以及vue数据响应的基 ...
- Vue 数据响应式原理
Vue 数据响应式原理 Vue.js 的核心包括一套“响应式系统”.“响应式”,是指当数据改变后,Vue 会通知到使用该数据的代码.例如,视图渲染中使用了数据,数据改变后,视图也会自动更新. 举个简单 ...
- 一探 Vue 数据响应式原理
一探 Vue 数据响应式原理 本文写于 2020 年 8 月 5 日 相信在很多新人第一次使用 Vue 这种框架的时候,就会被其修改数据便自动更新视图的操作所震撼. Vue 的文档中也这么写道: Vu ...
- 西安电话面试:谈谈Vue数据双向绑定原理,看看你的回答能打几分
最近我参加了一次来自西安的电话面试(第二轮,技术面),是大厂还是小作坊我在这里按下不表,先来说说这次电面给我留下印象较深的几道面试题,这次先来谈谈Vue的数据双向绑定原理. 情景再现: 当我手机铃声响 ...
- Vue基础01vue的基本示例,vue的双向数据绑定,vue中常见的几种用法,vue相关常见指令
自学vue框架,每天记录重要的知识点,与大家分享!有不足之处,希望大家指正. 本篇将讲述:vue的基本示例,vue的双向数据绑定,vue中常见的几种用法,vue相关常见指令 前期学习基础,使用vue. ...
- 【学习笔记】剖析MVVM框架,简单实现Vue数据双向绑定
前言: 学习前端也有半年多了,个人的学习欲望还比较强烈,很喜欢那种新知识在自己的演练下一点点实现的过程.最近一直在学vue框架,像网上大佬说的,入门容易深究难.不管是跟着开发文档学还是视频教程,按步骤 ...
- vue核心之响应式原理(双向绑定/数据驱动)
实例化一个vue对象时, Observer类将每个目标对象(即data)的键值转换成getter/setter形式,用于进行依赖收集以及调度更新. Observer src/core/observer ...
- Vue数据绑定和响应式原理
Vue数据绑定和响应式原理 当实例化一个Vue构造函数,会执行 Vue 的 init 方法,在 init 方法中主要执行三部分内容,一是初始化环境变量,而是处理 Vue 组件数据,三是解析挂载组件.以 ...
随机推荐
- 5种Python使用定时调度任务的方式
摘要:Python 有几种方法可以定时调度一个任务,这就是我们将在本文中学习的内容. 本文分享自华为云社区<Python中使用定时调度任务(Schedule Jobs)的5种方式)>,作者 ...
- MRS HetuEgine的数据虚拟化实践
摘要:华为MRS云原生数据湖平台的HetuEngine就是一款解决大数据时代跨源跨域问题的数据虚拟化引擎. 本文分享自华为云社区<基于华为云原生数据湖MRS HetuEgine的数据虚拟化实践& ...
- iOS App的打包和上架流程
转载:iOS App的打包和上架流程 - 掘金 1. 创建账号 苹果开发者账号几种开发者账号类型 个人开发者账号 费用:99 美元/年(688.00元) 协作人数:仅限开发者自己 不需要填写公司的 ...
- 火山引擎DataLeap的Catalog系统搜索实践 (二):整体架构
整体架构 火山引擎DataLeap的Catalog搜索系统使用了开源的搜索引擎Elasticsearch进行基础的文档检索(Recall阶段),因此各种资产元数据会被存放到Elasticsearch中 ...
- PPT 毕业答辩PPT应该怎么样改
PPT 毕业答辩PPT应该怎么样改
- PPT 没有电脑如何制作PPT
没有电脑如何制作PPT
- python+requests+unittest+htmltestrunner+Excel生成接口自动化的测试框架
Python+Requests+Unittest+Excel+HtmltestRunner生成自动化测试框架 流程 1.接口文档 2.读取接口文档 3.封装request的类 4.unittest类 ...
- Mongodb--索引(转载)
原文转载自:https://www.cnblogs.com/wyy1234/p/11032163.html 1 mongoDB索引的管理 本节介绍mongoDB中的索引,熟悉mysql/sqlserv ...
- 【JAVA基础】报错解决
报错解决 Failed to configure a DataSource: 'url' attribute is not specified and no embedd https://change ...
- C#9.0:Improved Pattern Matching
增强的模式匹配 C#9.0添加了几种新的模式.我们可以参阅模式匹配教程 ,来了解下面代码的上下文: 1 public static decimal CalculateToll(object vehic ...