• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Vue3兄弟组件传值

武飞扬头像
-青山如故
帮助3

Vue3中没有明确的兄弟组件传值,可以使用状态提升,找到这两个组件的共同父级组件,然后通过父与子之间的传值实现

那么首先咱们先定义一个父组件Root 和两个子组件我们取名叫Left和Right,要实现的效果是两个取色器可以双向绑定,一方改变颜色另一方与其同步一致

学新通

它是利用第三方进行    子传父父传子,依次进行绑定

学新通

 定义组件模板

  1.  
    <div id="app">
  2.  
    <my-root></my-root>
  3.  
    </div>
  4.  
     
  5.  
    <template id="root">
  6.  
     
  7.  
    </template>
  8.  
     
  9.  
    <template id="left">
  10.  
     
  11.  
    </template>
  12.  
     
  13.  
    <template id="right">
  14.  
     
  15.  
    </div>
  16.  
    </template>
学新通
  • 那么开始组件通信的四步骤,
  • 1.定义组件模块,
  • 2.定义组件,
  • 3.注册组件,
  • 4.使用组件
  1.  
    const Left = {
  2.  
    template:'#left',
  3.  
    data(){
  4.  
    return{
  5.  
    leftColor:'#0ff'//初始化数据颜色
  6.  
    }
  7.  
    },
  8.  
     
  9.  
    }
  10.  
    const Right = {
  11.  
    template:'#right',
  12.  
    data(){
  13.  
    return{
  14.  
    rightColor:'#00f'//初始化数据颜色
  15.  
    }
  16.  
    },
  17.  
    }
  18.  
    const Root = {
  19.  
    template:'#root',
  20.  
    data(){
  21.  
    return{
  22.  
    color:''
  23.  
    }
  24.  
    },
  25.  
    components:{
  26.  
    MyLeft: Left,
  27.  
    MyRight:Right,
  28.  
    }
  29.  
    }
  30.  
     
  31.  
    Vue.createApp({
  32.  
    components:{
  33.  
    MyRoot:Root
  34.  
    }
  35.  
    }).mount('#app')
学新通

接下来给父组件中添加子组件内容及数据,创建自定义事件change-color="getColor"获取当前颜色,:color="color":绑定事件color就是父组件默认颜色

  1.  
    <template id="root">
  2.  
    <my-left @change-color="getColor" :color="color"></my-left>
  3.  
    <!-- 添加自定义事件 -->
  4.  
    <my-right :color="color" @change-color="getColor"></my-right>
  5.  
    </template>

给子组件Left 和 Right 添加内容,那么我这边是写了两个取色器的小盒子,取色器 v-model 双向绑定颜色变量名

  1.  
    <template id="left">
  2.  
    <div :style="{width:'100px',height:'100px',float:'left','background-color':leftColor}">
  3.  
    <input type="color" v-model="leftColor">
  4.  
    </div>
  5.  
    </template>
  6.  
    <template id="right">
  7.  
    <div :style="{width:'100px',height:'100px',float:'left','background-color':rightColor}">
  8.  
    <input type="color" v-model="rightColor">
  9.  
    </div>
  10.  
    </template>

那么先来注册父组件,并且使用一个方法把自定义事件的函数getColor 给一个形参 val 设置当前颜色  this.color 为形参val

  1.  
    const Root = {
  2.  
    template:'#root',
  3.  
    data(){
  4.  
    return{
  5.  
    color:''
  6.  
    }
  7.  
    },
  8.  
    methods:{
  9.  
    getColor(val){//自定义事件函数
  10.  
    this.color = val //当前颜色
  11.  
    }
  12.  
    },
  13.  
    components:{//子组件left和right
  14.  
    MyLeft: Left,
  15.  
    MyRight:Right,
  16.  
    }
  17.  
    }
  18.  
    Vue.createApp({
  19.  
    components:{
  20.  
    MyRoot:Root
  21.  
    }
  22.  
    }).mount('#app')
学新通

注册使用子组件Left

那么我们先监听当前变量值, 给一个函数leftColor(newval)利用子传父  $emit('自定义事件名',参数)来进行监听

此时页面还是无法双向绑定,所以我们要在生命周期钩子函数updated更新后进行渲染页面的方法,当前变量就等于当前绑定的color颜色值

反之,当我们需要实现左右两个取色器盒子同步绑定渲染,子组件传给父组件后,left传给父,父传给right,right传给父,父传给left,这里我们用到了父传子props['自定义属性'] 

  1.  
    const Left = {
  2.  
    template:'#left',
  3.  
    data(){
  4.  
    return{
  5.  
    leftColor:'#0ff'//初始化数据
  6.  
    }
  7.  
    },
  8.  
    props:['color'],//父传子
  9.  
    watch:{//监听
  10.  
    leftColor(newval){
  11.  
    this.$emit('change-color',newval) //this.$emit('自定义事件',参数) 子传父
  12.  
    }
  13.  
    },
  14.  
    updated(){//更新后
  15.  
    this.leftColor = this.color //当前盒子颜色等于color
  16.  
    }
  17.  
    }
学新通

那么右边与左边一样的逻辑 ,right传父,父传left,left传父,父给right

  1.  
    const Right = {
  2.  
    template:'#right',
  3.  
    props:['color'],
  4.  
    data(){
  5.  
    return{
  6.  
    rightColor:'#00f'
  7.  
    }
  8.  
    },
  9.  
    watch:{
  10.  
    rightColor(newval){
  11.  
    this.$emit('change-color',newval)
  12.  
    }
  13.  
    },
  14.  
    updated(){
  15.  
    this.rightColor = this.color
  16.  
    }
  17.  
    }
学新通

那么整体代码如下

  1.  
    <body>
  2.  
    <div id="app">
  3.  
    <my-root></my-root>
  4.  
    </div>
  5.  
    </body>
  6.  
    <template id="root">
  7.  
    <my-left @change-color="getColor" :color="color"></my-left>
  8.  
    <!-- 添加自定义事件 -->
  9.  
    <my-right :color="color" @change-color="getColor"></my-right>
  10.  
    </template>
  11.  
    <template id="left">
  12.  
    <div :style="{width:'100px',height:'100px',float:'left','background-color':leftColor}">
  13.  
    <input type="color" v-model="leftColor">
  14.  
    </div>
  15.  
    </template>
  16.  
    <template id="right">
  17.  
    <div :style="{width:'100px',height:'100px',float:'left','background-color':rightColor}">
  18.  
    <input type="color" v-model="rightColor">
  19.  
    </div>
  20.  
    </template>
  21.  
    <script src="../lib/vue.global.js"></script>
  22.  
    <script>
  23.  
    const Left = {
  24.  
    template:'#left',
  25.  
    data(){
  26.  
    return{
  27.  
    leftColor:'#0ff'//初始化数据
  28.  
    }
  29.  
    },
  30.  
    props:['color'],//父传子
  31.  
    watch:{//监听
  32.  
    leftColor(newval){
  33.  
    this.$emit('change-color',newval) //this.$emit('自定义事件',参数) 子传父
  34.  
    }
  35.  
    },
  36.  
    updated(){//更新后
  37.  
    this.leftColor = this.color //当前盒子颜色等于color
  38.  
    }
  39.  
    }
  40.  
    const Right = {
  41.  
    template:'#right',
  42.  
    props:['color'],
  43.  
    data(){
  44.  
    return{
  45.  
    rightColor:'#00f'
  46.  
    }
  47.  
    },
  48.  
    watch:{
  49.  
    rightColor(newval){
  50.  
    this.$emit('change-color',newval)
  51.  
    }
  52.  
    },
  53.  
    updated(){
  54.  
    this.rightColor = this.color
  55.  
    }
  56.  
    }
  57.  
    const Root = {
  58.  
    template:'#root',
  59.  
    data(){
  60.  
    return{
  61.  
    color:''
  62.  
    }
  63.  
    },
  64.  
    methods:{
  65.  
    getColor(val){//自定义事件函数
  66.  
    this.color = val
  67.  
    }
  68.  
    },
  69.  
    components:{
  70.  
    MyLeft: Left,
  71.  
    MyRight:Right,
  72.  
    }
  73.  
    }
  74.  
    Vue.createApp({
  75.  
    components:{
  76.  
    MyRoot:Root
  77.  
    }
  78.  
    }).mount('#app')
  79.  
    </script>
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfhkjje
系列文章
更多 icon
同类精品
更多 icon
继续加载