在 vue 中,建立實體後才加入的屬性因為沒有被給予 getter 及 setter ,所以不會被響應系統察覺,但使用 set 方法加入的屬性則會被賦予 getter 及 setter ,因此使用 set 加入的屬性都可以被響應在頁面上。

* vue 無法在建立實體後增加屬性

只有一開始定義在選項物件上的屬性才會被 vue 當作響應物件,其他未在選項物件上的屬性都無法用直接加入的方式使其成為響應物件。

栗子一:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue</title>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">a: {{a}}, b: {{b}}
</div><script>
var vm = new Vue({el: "#app",data: {a: 1},created() {this.b = 1;}}
);
</script>
</body>
</html>

這裡我們在實體上設了兩個屬性: a 、 b ,其中 a 是用選項物件上的 data 設定,而 b是在 created 鉤子函數裡直接在實體( this )中新增

結果如下:

在控制器中我改變了a的值,頁面上的a也相應變成了2,但是b卻沒沒改變。 所以:只有 a 的 get 及 set 方法

為了使新加入的屬性擁有 getter 及 setter ,我們要使用 set 方法。

set 方法

set 方法可以在響應物件上加上屬性,使得此屬性也是響應的,但 set 有一個限制: 對象不能是 Vue 實體或是 Vue 實體的 root 資料物件,這項限制代表我們無法將上例的 b變為響應,因為 Vue 實體的 root 資料物件,但我們能新增資料物件中的屬性。

栗子:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue</title>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
<div id="app"><div>woman: {{user.name}},age: {{user.age}}</div>
</div><script>
var vm = new Vue({el: "#app",data: {user: {name: 'susan', // reactive},},created() {this.user.age = 18; // not reactive}}
);
</script>
</body>
</html>

就如上面所述的結果,並且在物件裡因為沒有實體中其他的屬性,我們可以更清楚的看出只有name 有 get 及 set 方法,而 age沒有。

這個問題可以透過 set 來處理,其定義如下:

Vue.set( target, key, value )
  • target : 目標物件或是目標陣列。
  • key : 目標屬性或是陣列元素位置。
  • value : 欲賦予的資料值。

現在我們使用 set 將 age加入響應系統中:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue</title>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
<div id="app"><div>woman: {{user.name}},age: {{user.age}}</div>
</div><script>
var vm = new Vue({el: "#app",data: {user: {name: 'susan', // reactive},},created() {this.$set(this.user, 'age', '23');}}
);
</script>
</body>
</html>

可以在console中查看:這次 age可以響應在頁面上了。

* 物件新增多個屬性

有時你可能不會只想要新增一個屬性,這時可以有兩種方式:

  • 叫用多次 set 設定每個屬性。
  • 使用 Object.assign() 或是 _.extend() 這類合併多個物件的方法
this.user = Object.assign({}, this.user, {age: 17, account: 'susan123'});
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue </title>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
<div id="app"><div>woman: {{user.name}}, age: {{user.age}}</div>
</div><script>
var vm = new Vue({el: "#app",data: {user: {name: 'susan', // reactive},},created() {this.user = Object.assign({}, this.user, {age: 17, account: 'susan123'});}}
);
</script>
</body>
</html>

結果為:

我們創了一個全新的空物件,並把 user及想要加入的屬性合併進去,接著在設定給 user,這樣一來就可以觸發 user的 setter 使其重新設置所有的屬性為響應的。

栗子一:添加數據

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue </title>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
<div id="app"><ul><li v-for="item in arr">{{item.weather}}</li></ul><button type="button" @click="Click1()">添加雨天</button>
</div><script>
var vm = new Vue({el: "#app",data: {arr: [{weather:'晴天' },{weather:'陰天' },{weather:'雷雨天' }],},methods:{Click1:function(){this.arr.push({weather:"雨天"});//为data中的items动态新增一条数据}}}
);
</script>
</body>
</html>

結果為:點擊雨天就增加雨天

栗子二:

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Vue </title><script src="https://unpkg.com/vue/dist/vue.js"></script>
</head><body><div id="app"><p v-for="item in arr" :key="item.age">{{item.name}}</p><button class="btn" @click="Click1()">susan1會換成susan4</button><br /><button class="btn" @click="Click2()">新增susan5</button></div><script>var vm = new Vue({el: "#app",data: {arr: [{ name: "susan1", age: 15 },{ name: "susan2", age: 16 },{ name: "susan3", age: 17 }],},methods: {Click1: function () {Vue.set(this.arr, 0, { name: "susan4", age: 18 })},Click2: function () {var arrLen = this.arr.length;Vue.set(this.arr, arrLen, { name: "susan5", id: arrLen });}}});</script>
</body></html>

結果為:

點擊前:

點擊后:

點擊susan1會換成susan4的button,susan1會變成susan4

點擊新增susan5則會相應增加一個Susan5

說明:set可以修改數據也可以增加數據。

拼搏30天VUE.js之 set(Part8)相关推荐

  1. Vue.js尤雨溪 30分钟纪录片(中文字幕)

    为了这个视频,我特地学了下怎么搬运和嵌入字幕,凑合着看吧. 原文链接:https://m.youtube.com/watch?v=OrxmtDw4pVI 作者:Honeypot     字幕:油管机器 ...

  2. vue.js学习笔记 from coderwhy

    文章目录 Part1 Meet Vue 1. 安装 2. hello world 3. Vue lifecycle Part2 Basic Vue 1. 插值操作 2. 绑定属性 v-bind 3. ...

  3. vue.js循环for(列表渲染)详解

    vue.js循环for(列表渲染)详解 一.总结 一句话总结: v-for <ul id="example-1"> <li v-for="item in ...

  4. 经典文摘:饿了么的 PWA 升级实践(结合Vue.js)

    自 Vue.js 官方推特第一次公开到现在,我们就一直在进行着将饿了么移动端网站升级为 Progressive Web App 的工作.直到近日在 Google I/O 2017 上登台亮相,才终于算 ...

  5. Vue.js 第二天: 列表渲染

    用v-for 把一个数组对应为一组元素 我们用 v-for 指令根据一组数组的选项列表进行渲染.v-for 指令需要使用 item in items 形式的特殊语法,items 是源数据数组并且 it ...

  6. Vue.js 学习笔记 第5章 内置指令

    本篇目录: 5.1 基本指令 5.2 条件渲染指令 5.3 列表渲染指令 v-for 5.4 方法与事件 5.5 实战:利用计算属性.指令等知识开发购物车 回顾一下第2.2节,我们己经介绍过指令(Di ...

  7. Vue.js——60分钟快速入门

    Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快速地上手并使 ...

  8. Vue.js 列表渲染

    用 v-for 把一个数组对应为一组元素 我们用 v-for 指令根据一组数组的选项列表进行渲染.v-for 指令需要使用 item in items 形式的特殊语法,items 是源数据数组并且 i ...

  9. Vue.js Class 与 Style 绑定

    操作元素的 class 列表和内联样式是数据绑定的一个常见需求.因为它们都是属性,所以我们可以用 v-bind 处理它们:只需要通过表达式计算出字符串结果即可.不过,字符串拼接麻烦且易错.因此,在将  ...

最新文章

  1. Reading-又更新了一些内容【Kotlin+MVP+Retrofit】
  2. 5.jsp中动态include与静态include的区别
  3. Python:每日一题002
  4. 普通话测试系统_普通话
  5. 论文浅尝 - IJCAI2020 | KGNN:基于知识图谱的图神经网络预测药物与药物相互作用...
  6. 基于Docker的Mysql主从复制搭建_mysql5.7.x
  7. linux 文件怎么不让删,请问如何设置权限,可以禁止用户删除文件
  8. 基于区块链技术的数据资产管理机制研究
  9. 大屏数据可视化源码_AxureBI数据大屏可视化原型设计软件
  10. ajax(3)---Conmon.js
  11. 1620:质因数分解
  12. 心知天气使用签名验证方式
  13. 将北京时间转换为世界协调时
  14. Unity3d游戏引擎Windy系列教程:常见组件扫盲讲解引入unity所需的脚本语言基础
  15. 深入浅出系列之——并查集详解【武侠版】【简单有趣】
  16. 业务中台的困境、及可能的解
  17. element -UI升级,使用el-tabs导致浏览器卡死问题
  18. Windows句柄数的限制
  19. 计算机网络实验【路由器的基本配置】
  20. 【科研】2023年CCF-B和CCF-C类会议截稿时间整理

热门文章

  1. 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩. 输入描述:
  2. js 如何获取浏览器的高度和宽度
  3. STM32F4 IAP实现总结
  4. 视频前景提取 (III)【Mat版本】
  5. bellman_ford
  6. SAP HANA XS ODATA的写法
  7. ubuntu文件夹右键没有共享选项
  8. vue 引入萤石视频
  9. jQuery获取下拉选单的值
  10. 全键盘模式,目前按center key 和LSK时候会进入menu 菜单,期望按center键进入编辑