组件通信与插槽
  # 1.组件通信
组件与组件之间的数据传递
- 父传 子
 - 子传 父
 - 中央事件总线 $bus
 - 状态管理vuex
 
# 1.1 回顾页面传值
- 通过url 传值
跳转链接:  url?key=value&key1=value1
接收参数:  location.search      【vue-router】  this.$route.query
- 本地存储
存数据:  localStorage.setItem(key,value)     sessionStorage
取数据; localStorage.getItem(key)
 1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 1.2 组件 父传子
在父组件中将数据传递给子组件
子组件需要父组件的数据 做页面的渲染
子组件props 接收到的数据 用法和 data中的数据用法完全一致
#父组件
<子组件 变量=“属性值” 变量1=“属性值1” >  </子组件> 
#子组件 
export default{
	props:["变量","变量1"]
}
 1
2
3
4
5
6
7
2
3
4
5
6
7
# 父组件 自定义属性传参
<子组件 :变量=“表达式”  v-bind:变量1=“表达式” >  </子组件> 
#子组件 
export default{
	props:{
        tilte:{
            type:String,    
            default:"默认值"
        },
        list:{
            type:Array,
            default:()=>[]      
            //引用数据类型的默认值 建议通过函数 返回 赋值(防止引用数据类型的地址问题)
        }
    }
}
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1.3 组件 子传父
#父组件
<子组件 变量=“属性值” 变量1=“属性值1” @自定义的事件类型名="执行函数名" >  </子组件> 
export default{
    methods:{
        执行函数名(获取到的子组件的回传参数){
            //业务逻辑
        }
    }  
}
 1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
#子组件
export default{
    data(){
        return{
            num:100
        }
    },
    methods:{
        callData(){
            //子传父
            this.$emit("自定义的事件类型名",需要传递的数据)
        }
    }
}
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1.4 中央事件总线 $bus
所有组件需要传递数据 都直接存到 $bus
其他的所有的组件 都可以直接找 $bus 获取 数据
优点:无视层级传数据
缺点:必须在同一个 页面组件中,切换页面后 $bus 就无法触发事件
//main.js  整个程序的入口
Vue.prototype.$bus = new Vue() ;  //中介 新的vue实例对象,专门存取数据  $emit 
//向$bus写入数据--存数据的组件
this.$bus.$emit('自定义的事件类型',数据)
//在组件中获取值 --取数据的组件
//找到当前组件的 created()
created(){
 this.$bus.$on('自定义的事件类型',data=>{
     console.log(data) //获取的数据
 })   
}
 1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 2.插槽 slot
父组件把 html 代码 传给子组件
子组件预留 html代码的位置 给父组件
# 2.1 匿名插槽
子组件的slot标签就是 预留给 父组件 传html代码的位置
#父组件
<子组件>
    #写入替换 slot插槽的html代码
	<html代码>
</子组件>
 1
2
3
4
5
2
3
4
5
#子组件
</div>
	#子组件提前给父组件预留的位置 插槽
	<slot></slot>
</div>
 1
2
3
4
5
2
3
4
5
# 2.2具名插槽
如果同一个子组件中出现多个 插槽 必须使用具名插槽
如果是同一个子组件中出现两个 插槽 可以一个匿名 一个具名
#父组件
<子组件>
    <div slot="插槽名1">
    </div>	  		
     <div slot="插槽名2">
    </div>
       <div slot="插槽名3">
    </div>
</子组件>
 1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
#子组件
<div>
    <slot name="插槽名1"></slot>    、
    <slot name="插槽名2"> </slot>
      <slot name="插槽名3"> </slot>
<div>
 1
2
3
4
5
6
2
3
4
5
6
# 2.3 作用域插槽
将子组件的数据 回传给 父组件的插槽 部分的代码进行使用
一般情况下:作用域插槽 都是基于 具名插槽进行操作
#父组件
<子组件>
    <div slot="插槽名1" slot-socpe="scope">
        {{scope.变量}}
    </div>	  		
     <div slot="插槽名2">
    </div>
</子组件>
 1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
#子组件
<div>
    <slot name="插槽名1" :变量=“str”></slot>    、
    <slot name="插槽名2"> </slot>
<div>
data(){
    return {
    	str:'啦啦啦'
    	}
 }
 1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 2.4 v-slot
父组件插槽语法简化
#父组件
<子组件>
    <div v-slot="插槽名1">
    </div>	  		
     <div v-slot="插槽名2">
    </div>
</子组件>
#父组件
<子组件>
    <template #插槽名1>
			<div> </div>
	</template>
     <div v-slot="插槽名2">
    </div>
</子组件>
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#父组件
<子组件>
    <template  #插槽名1="scope">
			<div >
                {{scope.变量}}
            </div>	
	</template>	
     <div slot="插槽名2">
    </div>
</子组件>
 1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
编辑  (opens new window)
  上次更新: 2022/06/10, 01:34:10