vue学习笔记(1)

1.检测变化

<ul>
     <li v-for="item in list">{{item}}</li>
</ul>

<script>
     export default {
          name: 'myComponent',
          data() {
               return {
                    list: [1, 2, 3, 4, 5]
               }
          },
          mounted() {
               let _self = this;
               setTimeout(function() {
                    _self.list[4] = 6;
               });
          }
     }
</script>

预期渲染后:
.1
.2
.3
.4
.6
实际:
.1
.2
.3
.4
.5

如何使变化能够被检测到?

// 更新数组
Vue.set(this.list, indexOfItem, newValue);

// 给对象添加一个新的属性
Vue.set(this.object, 'name', 'Tom');

组件间通信

1.父子组件通信

(1).父传给子组件

   pass props

父组件:

<template>
    <parent>
        <child :list="list"></child> //在这里绑定list对象
    </parent>
</template>
import child from 'child.vue';
export default{
components:{child},
  data(){
   return {
   //父组件的数据绑定到子组件的包裹层上
  list:["haha","hehe","xixi"];
}
}

子组件 child.vue:(子组件要嵌套到父组件中)

<template>
   <ul>
        <li v-for="(item ,index)in list">{{item}}</li>
    </ul>
</template>
export default{
     props:{
    list:{
      type:Array,//type为Array,default为函数
      default(){
        return [
          "hahaxixihehe"//默认初始值
        ]}}
    },//用props属性进行传数据,此时子组件已经获取到list的数据了 data(){ return {} } }

 (2).由上面可见,props数据流是单向的。父组件属性更新时,将会传递给子组件,反过来则是不可以的。

 子传父

Emit events

Parent
{
     name: "parent",
     template: '<div><span>Parent</span><child v-on:alarm="alarmHandler"></child></div>',
     methods: {
          alarmHandler() {
               alert('Alarm!');
          }
     }
}

Child
{
     name: "child",
     template: '<div>Child</div>',
     mounted() {
          let _self = this;
          setTimeout(function(){
               // 发出事件
               _self.$emit('alarm');
          }, 2000);
     }
}

父组件监听子组件的事件,当子组件发出事件时,父组件处理。由此完成子组件向父组件传递信息的过程。

直接操作子组件(通过ref属性可以直接访问子组件)

Parent
{
     name: "parent",
     template: '<div><span>Parent</span><child ref="childComponent"></child></div>',
     mounted() {
          let child = this.$refs.childComponent;
     }
}

Child
{
     name: "child",
     template: '<div>Child</div>',
     data() {
          return {
               id: 1
          }
     },
     methods: {
          childFunc() {}
     }
}

非父子组件的通信(事件总线)

Event bus

var eventBus = new vue();

//在A组件发送事件
eventBus.$emit('msgChanged');

//在B组件监听发送的事件
eventBus.$on('msgChanged',function(){
        //do  something...
    })

 

posted @ 2018-01-30 11:01  无花即无果  阅读(162)  评论(0编辑  收藏  举报