7.响应式编程.html 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>Document</title>
  8. <script src="../../vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="app">
  12. <p>{{ msg }}</p>
  13. <p><button @click="msg = 'hi'">修改msg</button></p>
  14. <ul>
  15. <li v-for="l of list" :key="l">{{ l }}</li>
  16. </ul>
  17. <button @click="changeList">修改list</button>
  18. <ul>
  19. <li v-for="(v, p) of user" :key="p">{{ p }} = {{ v }}</li>
  20. <button @click="user.name = 'guoguo'">修改name属性为 guoguo</button>
  21. <!-- 下面直接给对象 添加或者删除 属性时 视图是不会更新的(即非响应式的) -->
  22. <button @click="user.sex = '男'">新增一个属性sex</button>
  23. <button @click="delete user.hobby">删除属性hobby</button>
  24. <!-- 如果对象属性的新增和删除 能是响应式的 要使用Vue提供两个方法: -->
  25. <!-- Vue.set( target, propertyName/index, value ) | vm.$set() 响应式添加对象属性 -->
  26. <!-- Vue.delete( target, propertyName/index ) | vm.$delete() 响应式删除对象属性 -->
  27. <button @click="$set(user, 'sex', '男')">响应式-新增属性sex</button>
  28. <button @click="$delete(user, 'hobby')">响应式-删除属性hobby</button>
  29. <button @click="user = {...user, sex: '女'}">
  30. 新值换旧值实现响应式
  31. </button>
  32. </ul>
  33. </div>
  34. <script>
  35. var vm = new Vue({
  36. data: {
  37. msg: 'hello', // 针对 基本数据类型, 当值被替换后,Vue是很容易监听到的
  38. list: [1, 2, 3],
  39. user: {
  40. id: 1,
  41. name: '大侠',
  42. hobby: ['篮球', '足球'],
  43. },
  44. },
  45. methods: {
  46. changeList() {
  47. // 1 下面修改数组 是不会引发视图更新(即非响应式的)
  48. // this.list[1] = 4; // 非响应式
  49. // 2 因此 要注意:其一:使用 Vue提供的数组变更方法 才会 引发视图更新。
  50. /**
  51. push()
  52. pop()
  53. shift()
  54. unshift()
  55. splice()
  56. sort()
  57. reverse()
  58. * */
  59. // 下面是响应式的
  60. // this.list.splice(1, 1, 4);
  61. // this.list.push(5);
  62. // 3 因此 要注意:其二:用新数组 替换 旧值 也能引发视图更新
  63. var newArr = [...this.list]; // 拷贝原list数组
  64. newArr[1] = 4;
  65. this.list = newArr;
  66. },
  67. },
  68. }).$mount('#app');
  69. </script>
  70. </body>
  71. </html>