vue每日一文

vue 组件间传值:父传子 / 子传父 / 子传子 / 祖传孙

2021-01-13  本文已影响0人  永恒即是最美
父传子(使用props)
父组件发送:
<child :dataToSon="dataToSon"></child>
data(){
  return {
    dataToSon:456
  }
}
子组件接收:
props: {
    dataToSon: {
      type: Number,
      default: 123,
    },
}
子传父(使用$emit)
父组件:
<div>{{data}}</div>
<child @change-from-son="change"></child>
data(){
  return {
    data:456
  }
}
method:{
  change(n){
    this.data = n
  },
}
子组件调用:
this.$emit('change-from-son',123)
子传子(组件传组件,使用$on)
var app= new Vue()
// 在组件 B 绑定自定义事件
app.$on('id-selected', function (id) {
  console.log(id)
})
// 触发组件 A 中的事件
app.$emit('id-selected', 1)
祖传孙(attrs 与 listeners或者provide 与 inject)

provide 与 inject:

1.版本2.2.0以上
2.主要在开发高阶插件/组件库时使用,不推荐用于普通应用程序代码中

//父级组件提供 'foo'
var Provider = {
  provide: {
    foo: 'bar'
  },
  // ...
}
//子孙组件注入 'foo'
var Child = {
  inject: {
    from: 'bar',    //from 表示源头 'property'
    foo: { default: 'foo' }    //2.5.0版本以上可以设置默认值
  }
  props: {
    bar: {
      default () {
        return this.foo    // 2.2.1版本以下会在props 和 data 初始化之后得到
      }
    }
  },
  data () {
    return {
      bar: this.foo    // 2.2.1版本以下会在props 和 data 初始化之后得到
    }
  },
  created () {
    console.log(this.foo)    // => "bar"
  }
  // ...
}

attrs 与 listeners:

$attrs则可以直接获取未在 props 定义的值,class 和 style除外。孙组件要访问父组件的属性和调用方法,一级一级传下去就可以了。

// 父组件
<home title="标题" :num="80" :status="false" :data="{type: 1}"/>    //v-on="{a: f()}"等价于v-on:a="f()"
// 子组件
props: { 
    title: {
        type: String,
        default: ''  
    }
},
mounted() {
    console.log(this.$attrs) // { num: 80, status: false, data: {type: 1} }    没有 title: "标题"
},
// 父组件
<home @change="change"/>
// 子组件
mounted() {
    console.log(this.$listeners) // 即可拿到 change 事件
}
//inheritAttrs:false 时
//不会把未被注册的props呈现为普通的HTML属性,依然可以通过其$attrs可以获取到没有使用的注册属性
eventBus与Vuex

eventBus通讯

//方式一
Vue.prototype.$EventBus = new Vue();    //main.js中
this.$EventBus.$emit('eventName', param1,param2,...)    //触发
this.$EventBus.$on('eventName', (param1,param2,...)=>{    //监听
    //...
})
this.$EventBus.$off('eventName')    //移除,没有参数时全部移除,要注意移除,否则容易出现问题
//方式二
window.eventBus = new Vue();    //main.js中
EventBus.$emit('eventName', param1,param2,...)    //触发
EventBus.$on('eventName', (param1,param2,...)=>{    //监听
    //...
})
EventBus.$off('eventName')    //移除,没有参数时全部移除,要注意移除,否则容易出现问题

Vuex

太多,略……

上一篇 下一篇

猜你喜欢

热点阅读