Luo Hao

Vue.js实战读书笔记(2)

Rehoni / 2019-03-08


学习链接:

  1. Vue官方教程 https://cn.vuejs.org/
  2. https://www.w3cplus.com/blog/vue

v-model: 绑定动态数据可以用v-bind来实现。

  1. 修饰符:lazy(change事件中同步),number(限定数字),trim(自动过滤首位的输入空格),

  2. template的DOM结构必须被一个元素包含,如果直接写成 “这里是组件 的内容”,不带<div></div>是无法渲染的。

  3. Vue 组件的模板在某些情况下会受到HTML的限制,比如<table>内规定只允许是〈位〉、<td>、<th>等这些表格元素,所以在<table>内直接使用组件是无效的。这种情况下,可以使用特殊的is属性来挂载组件。 <tbody is="my-component"></tbody>tbody在渲染时,会被替换为组件的内容。常见的限制元素还有<ul>、<ol>、<select>。

props: 数组和对象。

  1. props 中声明的数据与组件 data 函数 return 的数据主要区别就是: props 的来自父级,而 data 中的是组件自己的数据,作用域是组件本身,这两种数据都可以在模板 template 及计算属性 computed和方法 methods 中使用。

  2. 由于 HT岛E 特性不区分大小写,当使用 DOM 模板时,驼峰命名 (camelCase)的 props 名称要转为短横分隔命名 (kebab-case)

    <div id=" app” >
     <my-component warning-text = ”提示信息 " ></ my-component>
     </div>
     <script>
     Vue.component ( ' my-component ', {
     props: [ 'warningText'],
     template:' <div>{{ warningText }} </div>'
     });
     var app =new Vue({
     el:' #app '
     })
     </script>
    
  3. 有时候,传递的数据并不是直接写死的,而是来自父级的动态数据,这时可以使用指令 v-bind 来动态绑定 props 的值,当父组件的数据变化时,也会传递给子组件。

  4. 如果你要直接传递数字、布尔值、数组、对象,而且不使用v-bind,传递的仅仅是字符串。下边message.length=7,而:message.length=3。

  5. 在JavaScript中对象和数组是引用类型,指向同一个内存空间,所以 props 是对象和数组时,在子组件内改变是会影响父组件的。

  <div id=" app " >
    <my-component message=" [ 1 , 2, 3 ] " ></my-component>
    <my-component :message=" [ 1 , 2, 3 ] " ></my-component>
  </div>
  <script>
    Vue.component (' my-component ', {
    props: [ ' message ' ],
    template:'<div>{{ message.length }}</div>'
    });
    var app =new Vue ( {
      el: '#app'
    })
  </script>

数据验证

组件通信

  1. 自定义事件:如果你了解过 JavaScript 的设计模式一一观察者模式, 一定知道 dispatchEvent 和 addEventListener这两个方法。 Vue 组件也有与之类似的一套模式,子组件用 $emit()来触发事件,父组件用 $on()来监听子组件的事件 。
  2. 中央事件总线(bus):首先创建了 一个名为 bus 的空 Vue 实例,里面没有任何内容;然后全局定义了组件component-a;最后创建 Vue 实例 app ,在 app 初始化时,也就是在生命周期 mounted 钩子函数里监听了来自 bus 的事件 on-message,而在组件 component-a 中,点击按钮会通过 bus 把事件 on-message发出去,此时 app 就会接收到来自 bus 的事件,进而在回调里完成自己的业务逻辑。如果深入使用,可以扩展 bus 实例,给它添加 data 、 methods、 computed 等选工页,这些都是可以公用的,在业务中,尤其是协同开发时非常有用,因为经常需要共享一些通用的信息,比如用户登录的昵称、性别、邮箱等,还有用户的授权 token 等。只需在初始化时让 bus 获取一次,任何时间、任何组件就可以从中直接使用了,在单页面富应用( SPA )中会很实用,也可以选择更好的状态管理解决方案vuex。
  3. 父链:在子组件中,使用 this.$parent 可以直接访问该组件的父实例或组件,父组件也可以通过this.$children 访问它所有的子组件,而且可以递归向上或向下无线访问, 直到根实例或最内层的组件。尽管 Vue 允许这样操作,但在业务中 , 子组件应该尽可能地避免依赖父组件的数据,更不应该去主动修改它的数据,因为这样使得父子组件紧藕合,只看父组件,很难理解父组件的状态,因为它可能被任意组件修改 , 理想情况下,只有组件自己能修改它的状态。父子组件最好还是通过props 和 $emit 来通信。
  4. 当子组件较多时 ,通过 this.$children 来一一遍历出我们需要的一个组件实例是比较困难的,尤其是组件动态渲染时,它们的序列是不固定的。 Vue 提供了子组件索引的方法,用特殊的属性 ref 来为子组件指定一个索引名称。通过父组件事件函数调用声明 $ref 子组件进行内容访问or修改。$refs只在组件渲染完成后才填充,并且它是非响应式的。它仅仅作为一个直接访问子组件的应急方案,应当避免在模板或计算属性中使用$refs。
<div id="app">
  {{message}}
    <component-a></component-a>
</div>
<script>
    var bus = new Vue();
    Vue.component('component-a', {
        template: '<button @click="handleEvent">传递事件</button>',
        methods: {
            handleEvent: function () {
                bus.$emit('on-message', '来自组件component-a的内容');
            }
        }
    });
  var app = new Vue({
      el: '#app',
      data: {
          message: ''
      },
      mounted: function () {
          var _this = this;
          bus.$on('on-message', function (msg) {
              _this.message = msg;
          });
      }
  })
</script>