一、refs 和 操作 DOM

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <div id="app" :style="{color: xColor}">
  9. <p ref="p1">{{msg}}</p>
  10. <ul>
  11. <!-- <li v-for="(item, index) in ary"
  12. v-if="index % 2 != 0"
  13. ref="listItem"
  14. :key="index">{{item}}</li>-->
  15. <li v-for="(item, index) in oddIndex"
  16. ref="listItem"
  17. :key="index">{{item}}</li>
  18. </ul>
  19. </div>
  20. <script src="vue.js"></script>
  21. <script>
  22. // Vue 是数据驱动的,不提倡操作 DOM;但是必要的时候还是需要操作 DOM 的;Vue 为我们提供了专门的方式获取 DOM;
  23. // ref 属性和 vm.$refs
  24. // 如果这个列表不需要全部渲染,可以写一个计算属性,v-for 这个计算属性
  25. // 或者,v-if 条件渲染
  26. let vm = new Vue({
  27. el: '#app',
  28. data: {
  29. msg: 'hello',
  30. ary: [1, 2, 3, 4],
  31. xColor: ''
  32. },
  33. computed: {
  34. oddIndex() {
  35. return this.ary.filter((item, index) => index % 2 !== 0);
  36. }
  37. },
  38. mounted() {
  39. // console.log(this.$refs);
  40. console.log(this.$refs.p1);
  41. console.log(this.$refs.listItem);
  42. // 我们通过 this.$refs 获取 DOM 元素;
  43. this.$refs.p1.style.color = 'red'; // 可以实现,但是不推荐操作 DOM;
  44. // 首先要在获取的元素添加 ref="标识符" 的行内属性
  45. // 获取的时候 this.$refs.标识符 获取元素;
  46. // 如果相同的 ref 有一个,获取到的就是带这个 ref 的原生元素对象
  47. // 如果相同的 ref 有多个,获取到的是所有带有这个 ref 的元素组成的数组
  48. }
  49. })
  50. </script>
  51. </body>
  52. </html>

二、Vue-DOM 更新和 nextTick

  1. <div id="app">
  2. <ul>
  3. <li v-for="(item, index) in ary"
  4. ref="listItem"
  5. :key="index">{{item}}</li>
  6. </ul>
  7. </div>
  8. <script src="vue.js"></script>
  9. <script>
  10. let vm = new Vue({
  11. el: '#app',
  12. data: {
  13. ary: [1, 3, 5]
  14. },
  15. mounted() {
  16. console.log(this.$refs.listItem.length);
  17. this.ary.push(7, 9);
  18. // console.log(this.$refs.listItem.length); // 为啥还是3?不是5呢?
  19. // 这是因为 Vue 更新 DOM 的机制是异步的;push 7,9后并没有直接就去更新 DOM,而是先等同步任务; 26行的 console 执行完,才去执行异步的更新 DOM;
  20. // 如果一定要获取更新数据以后的 DOM,要用 $nextTick;
  21. this.$nextTick(() => {
  22. // $nextTick 会把回调放到 DOM 更新以后执行
  23. console.log(this.$refs.listItem.length);
  24. })
  25. }
  26. })
  27. </script>

二、template

Vue 创建实例或者组件的时候,可以配置 template 属性,指定 vue 要渲染的模板;有两种使用方式;

  1. 在 html 中写一个 template 标签,把模板内容写在 template 标签中,绑定数据的语法和指令不变;然后在创建实例的时候添加 template 属性,值是 #template 标签的 id
  2. 指定一个字符串作为模板,字符串中要写绑定数据的 html 结构;在创建实例的时候,指定 template 属性,值就是模板字符串;

注意:

  1. template 属性会把根 DOM 节点替换掉
  2. template 属性只能有一个根节点(template 标签只能有一个子元素,如果是模板字符串,所有的内容要包裹在一个标签中)
  1. <div id="app"></div>
  2. <template id="tpl"> <!--模板渲染后,根 DOM 元素被替换掉了,template 标签本身不会被渲染到应用中-->
  3. <div>
  4. <button>{{msg}}</button>
  5. <p>23456789</p>
  6. <span>567890</span>
  7. </div>
  8. <!--<p>哈哈哈哈</p>-->
  9. </template>
  10. <script src="vue.js"></script>
  11. <script>
  12. let vm = new Vue({
  13. // template: '#tpl',
  14. template: "<div>{{msg}} <p>2333333~</p></div>",
  15. el: '#app',
  16. data: {
  17. msg: 'hello world'
  18. }
  19. });
  20. </script>