Skip to main content

组件传值

  1. props 父组件给子组件传值

props 值可以是一个数组或对象;

// 数组:不建议使用
props:[]

// 对象
props:{
inpVal:{
type:Number, //传入值限定类型
// type 值可为String,Number,Boolean,Array,Object,Date,Function,Symbol
// type 还可以是一个自定义的构造函数,并且通过 instanceof 来进行检查确认
required: true, //是否必传
default:200, //默认值,对象或数组默认值必须从一个工厂函数获取如 default:()=>[]
validator:(value) {
// 这个值必须匹配下列字符串中的一个
return ['success', 'warning', 'danger'].indexOf(value) !== -1
}
}
}
  1. $emit 子组件给父组件传值 触发子组件触发父组件给自己绑定的事件,其实就是子传父的方法 // 父组件 <v-Header @title="title"> // 子组件 this.$emit('title',{title:'这是title'})
3. vuex 数据状态管理

state:定义存贮数据的仓库 ,可通过 this.$store.state 或 mapState 访问
getter:获取 store 值,可认为是 store 的计算属性,可通过 this.$store.getter 或 mapGetters 访问
mutation:同步改变 store 值,可通过 mapMutations 调用
action:异步调用函数执行 mutation,进而改变 store 值,可通过 this.$dispatch 或 mapActions 访问
modules:模块,如果状态过多,可以拆分成模块,最后在入口通过...解构引入

4. attrs 和 listeners
attrs 获取子传父中未在 props 定义的值

```js
// 父组件
<home title="这是标题" width="80" height="80" imgUrl="imgUrl"/>
// 子组件
mounted() {
console.log(this.$attrs) //{title: "这是标题", width: "80", height: "80", imgUrl: "imgUrl"}
}

// 相对应的如果子组件定义了 props,打印的值就是剔除定义的属性

props: {
width: {
type: String,
default: ''
}
},
mounted() {
console.log(this.$attrs) //{title: "这是标题", height: "80", imgUrl: "imgUrl"}
}

listeners:场景:子组件需要调用父组件的方法。 解决:父组件的方法可以通过 v-on="listeners" 传入内部组件——在创建更高层次的组件时非常有用

// 父组件
<home @change="change"/>

// 子组件
mounted() {
console.log(this.$listeners) //即可拿到 change 事件
}
  1. provide 和 inject provide 和 inject 主要为高阶插件/组件库提供用例。并不推荐直接用于应用程序代码中; 并且这对选项需要一起使用; 以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。
//父组件:
provide: { //provide 是一个对象,提供一个属性或方法
foo: '这是 foo',
fooMethod:()=>{
console.log('父组件 fooMethod 被调用')
}
},

// 子或者孙子组件
inject: ['foo','fooMethod'], //数组或者对象,注入到子组件
mounted() {
this.fooMethod()
console.log(this.foo)
}
//在父组件下面所有的子组件都可以利用inject
  1. $refs 通常用于父组件调用子组件的方法
// 父组件
<home ref="child"/>

mounted(){
console.log(this.$refs.child) //即可拿到子组件的实例,就可以直接操作 data 和 methods
}
  1. EventBus

就是声明一个全局 Vue 实例变量 EventBus , 把所有的通信数据,事件监听都存储到这个变量上; 类似于 Vuex。但这种方式只适用于极小的项目 3.原理就是利用 emit 并实例化一个全局 vue 实现数据共享

// 在 main.js
Vue.prototype.$eventBus = new Vue()

// 传值组件
this.$eventBus.$emit('eventTarget', '这是eventTarget传过来的值')

// 接收组件
this.$eventBus.$on('eventTarget', v => {
console.log('eventTarget', v) //这是eventTarget传过来的值
})

参考