vue组件之间通信方式汇总

news2024/11/19 6:42:07

方式1:props和$emit

props和$emit仅仅限制在父子组件中使用

1.props:父组件向子组件传递数据

1.1 代码展示
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld :age="age" msg="这是父组件的数据" :person="person"/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      }
    };
  },
  components: {
    HelloWorld
  },
}
</script>

<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,接收父组件的数据传递,age的值是:{{this.age}}</div>
    <div>这是子组件,接收父组件的数据传递,person的值是:{{person.name}} --- {{person.address}}</div>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  props:["age", "person"],
  
}
</script>

1.2 过程分解

在这里插入图片描述

2.$emit:子组件向父组件传递数据

2.1 代码展示
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>父组件中接收子组件的数据fatherInfo的值是:{{this.fatherInfo}}</div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld :age="age"  :person="person" @sendFather="reciveInfo"/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },
  components: {
    HelloWorld
  },
  methods: {
    reciveInfo(info) {
      this.fatherInfo = info;
    }
  }
}
</script>

<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,接收父组件的数据传递,age的值是:{{this.age}}</div>
    <div>这是子组件,接收父组件的数据传递,person的值是:{{person.name}} --- {{person.address}}</div>
    ----------------------------------------------------------------------------------------------------
    <div><button @click="sendMessage">子组件向父组件传递数据的按钮</button></div>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  props:["age", "person"],
  methods: {
    sendMessage() {
      this.$emit("sendFather", this.info);
    }
  }
  
}
</script>

2.2 过程分解


在这里插入图片描述

3.子组件改变父组件传入的props值的方式

3.1.1借助.sync实现
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>父组件中接收子组件的数据fatherInfo的值是:{{this.fatherInfo}}</div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld :age.sync="age"  :person.sync="person"/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },
  components: {
    HelloWorld
  },
  methods: {
    reciveInfo(info) {
      this.fatherInfo = info;
    }
  }
}
</script>

<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,接收父组件的数据传递,age的值是:{{this.age}}</div>
    <div>这是子组件,接收父组件的数据传递,person的值是:{{person.name}} --- {{person.address}}</div>
    ----------------------------------------------------------------------------------------------------
    <div><button @click="sendMessage">用于修改props里面值的按钮</button></div>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  props:["age", "person"],
  methods: {
    sendMessage() {
      this.$emit("update:age", 19);
      this.$emit("update:person", {name: "李四", address: "bbb"});
    }
  }
  
}
</script>

3.1.2 过程分解

在这里插入图片描述
在这里插入图片描述

3.2.1借助v-model实现,该方式在表单提交中较为常用
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>父组件中接收子组件的数据fatherInfo的值是:{{this.fatherInfo}}</div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld :age="age"  :person="person"/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },
  components: {
    HelloWorld
  },
  methods: {
    reciveInfo(info) {
      this.fatherInfo = info;
    }
  }
}
</script>

<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,接收父组件的数据传递,age的值是:{{this.age}}</div>
    <div>这是子组件,接收父组件的数据传递,person的值是:{{person.name}} --- {{person.address}}</div>
    ----------------------------------------------------------------------------------------------------
    <input v-model="age" placeholder="请输入年龄"/>
    <input v-model="person.name" placeholder="请输入名称"/>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  props:["age", "person"],
  methods: {
    sendMessage() {
      this.$emit("update:age", 19);
      this.$emit("update:person", {name: "李四", address: "bbb"});
    }
  }
  
}
</script>

3.2.2 过程分解

在这里插入图片描述
在这里插入图片描述

3.3.1对于非基本数据类型,只改变其中某个属性的值,可以直接实现
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>父组件中接收子组件的数据fatherInfo的值是:{{this.fatherInfo}}</div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld :age="age"  :person="person"/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },
  components: {
    HelloWorld
  },
  methods: {
    reciveInfo(info) {
      this.fatherInfo = info;
    }
  }
}
</script>

<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,接收父组件的数据传递,age的值是:{{this.age}}</div>
    <div>这是子组件,接收父组件的数据传递,person的值是:{{person.name}} --- {{person.address}}</div>
    ----------------------------------------------------------------------------------------------------
    <div><button @click="sendMessage">用于修改props里面值的按钮</button></div>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  props:["age", "person"],
  methods: {
    sendMessage() {
      this.age = 19;
      this.person.name = "李四";
    }
  }
  
}
</script>

3.3.2 过程分解

在这里插入图片描述
在这里插入图片描述

方式2:provide和inject

provide和inject在传递上比方式一更加的宽泛,当provide的组件上添加了,那么其后代都可以通过inject进行数据接收,不限制在父子组件之间

2.1代码展示

<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>父组件中接收子组件的数据fatherInfo的值是:{{this.fatherInfo}}</div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },
  provide() {
    return {
      age : this.age,
      person: this.person
    }
  },
  components: {
    HelloWorld
  },
  methods: {
    reciveInfo(info) {
      this.fatherInfo = info;
    }
  }
}
</script>

<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,接收父组件的数据传递,age的值是:{{this.age}}</div>
    <div>这是子组件,接收父组件的数据传递,person的值是:{{person.name}} --- {{person.address}}</div>
    ----------------------------------------------------------------------------------------------------
    <Hello1 />
  </div>
</template>

<script>
import Hello1 from '@/components/Hello1.vue'
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  inject:["age", "person"],
  components: {
    Hello1
  }
}
</script>


<template>
  <!-- 这是父组件 -->
<div >
  <div>这是孙组件,接收组件的数据传递,age的值是:{{this.age}}</div>
  <div>这是孙组件,接收组件的数据传递,person的值是:{{person.name}} --- {{person.address}}</div>
</div>
</template>

<script>

export default {
name: 'Hello1',
inject: ["age", "person"]

}
</script>
<style>

</style>

2.2过程分解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3provide和inject响应式写法

上面的写法有个问题,如果你只是针对非基本数据类型的某个属性进行修改,修改后所有的地方都会进行改变,但是改变基本数据类型后改变整个对象后,组件本身会改变,但是其他不会随之改变,会造成数据不一致问题。

2.3.1 问题展示
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>父组件中接收子组件的数据fatherInfo的值是:{{this.fatherInfo}}</div>
    <div>
      <button @click="change1">父组件中修改provide传递的值</button>
    </div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },
  provide() {
    return {
      age : this.age,
      person: this.person
    }
  },
  components: {
    HelloWorld
  },
  methods: {
    change1() {
      this.age = 19;
      this.person.name = "李四";
    }
  }
}
</script>

在这里插入图片描述
在这里插入图片描述

2.3.2 解决方式
2.3.2.1 代码展示
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>父组件中接收子组件的数据fatherInfo的值是:{{this.fatherInfo}}</div>
    <div>
      <button @click="change1">父组件中修改provide传递的值</button>
    </div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },
  provide() {
    return {
      age : () => this.age,
      person: () => this.person
    }
  },
  components: {
    HelloWorld
  },
  methods: {
    change1() {
      this.age = 19;
      this.person.name = "李四";
    }
  }
}
</script>

<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,接收父组件的数据传递,age的值是:{{this.age()}}</div>
    <div>这是子组件,接收父组件的数据传递,person的值是:{{person().name}} --- {{person().address}}</div>
    ----------------------------------------------------------------------------------------------------
    <Hello1 />
  </div>
</template>

<script>
import Hello1 from '@/components/Hello1.vue'
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  inject:["age", "person"],
  components: {
    Hello1
  }
}
</script>


<template>
  <!-- 这是孙组件 -->
<div >
  <div>这是孙组件,接收组件的数据传递,age的值是:{{this.age()}}</div>
  <div>这是孙组件,接收组件的数据传递,person的值是:{{person().name}} --- {{person().address}}</div>
</div>
</template>

<script>

export default {
name: 'Hello1',
inject: ["age", "person"]

}
</script>
<style>

</style>
2.3.2.2 过程分解

在这里插入图片描述
在这里插入图片描述

2.3.2.3 使用备注

当我们后代组件想修改inject接收的数据时,如果是响应式的书写方式,那么无法提供修改方式(可以通过下面的$listeners去源头进行修改);如果是非响应式的书写,对于非基本数据类型来说,只是改变对象里面的某个属性是可以的,但是这种修改会很难知道是哪个组件对属性进行了修改,比较难以追踪,需要谨慎。其他的不建议修改,会造成数据不一致。

方式3:$parent和$children

这种方式很直接,将整个实例都获取去直接操作,$children是当前组件的直接子组件实例;$parent是当前组件的父组件实例,可以实现父组件及其后代组件上数据之间的传递。这种方式是获取组件本身的对象,与组件之间引用放置的顺序由很大关联,当改变组件引用的顺序时,需要同时修改获取原组件的下标,使用时需要谨慎考虑。

3.1代码展示

3.1.1 $children修改后代组件数据
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>
      <button @click="change1">修改后代组件的值</button>
    </div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },

  components: {
    HelloWorld
  },
  methods: {
    change1() {
      this.$children[0].info = "修改子组件的数据";
      this.$children[0].$children[0].count = "修改孙组件的数据";
    }
  }
}
</script>

<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,nfo的值是:{{this.info}}</div>
    ----------------------------------------------------------------------------------------------------
    <Hello1 />
  </div>
</template>

<script>
import Hello1 from '@/components/Hello1.vue'
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  components: {
    Hello1
  },
  methods: {
    change2() {
    }
  }
}
</script>


<template>
  <!-- 这是孙组件 -->
<div >
  <div>这是孙组件,count的值是:{{this.count}}</div>
 
</div>
</template>

<script>

export default {
name: 'Hello1',
data() {
  return {
    count : "孙组件数据"
  }
}
}
</script>
<style>

</style>
3.1.2 过程分解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2.1 $parent修改先辈属性值
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },

  components: {
    HelloWorld
  },
  methods: {
    change1() {
      this.$children[0].info = "修改子组件的数据";
      this.$children[0].$children[0].count = "修改孙组件的数据";
    }
  }
}
</script>

<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,nfo的值是:{{this.info}}</div>
    ----------------------------------------------------------------------------------------------------
    <Hello1 />
  </div>
</template>

<script>
import Hello1 from '@/components/Hello1.vue'
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  components: {
    Hello1
  },
  methods: {
    change2() {
    }
  }
}
</script>


<template>
  <!-- 这是孙组件 -->
<div >
  <div>这是孙组件,count的值是:{{this.count}}</div>
  <div>
    <button @click="change3">修改后先辈组件的值</button>
  </div>
</div>
</template>

<script>

export default {
  name: 'Hello1',
  data() {
    return {
      count : "孙组件数据"
    }
  },
  methods: {
    change3() {
      debugger;
      this.$parent.info ="修改直接父辈组件的值";
      this.$parent.$parent.age = 20;
    }
  },
}
</script>
<style>

</style>
3.2.2 过程分解

在这里插入图片描述

方式4:$ref和$refs

这种方式和方式三一样是获取组件实例本身去操作。在组件上添加一个ref属性,给与这个组件一个标志,通过该标志去获取组件本身的实例,相比较与方式三需要确定组件的引用顺序,该方式没有该苦恼,但是在给ref值的时候注意值不要重复。同时没有办法通过$ref去获取父类对象,这点是相比较于方式三的缺陷。

4.1代码展示

<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>
      <button @click="change1">修改后代组件的值</button>
    </div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld ref="helloWorld"/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },

  components: {
    HelloWorld
  },
  methods: {
    change1() {
      debugger;
      this.$refs.helloWorld.info = "修改子组件的值";
      this.$refs.helloWorld.$refs.hello1.count = "修改孙组件的值";
    }
  }
}
</script>
<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,nfo的值是:{{this.info}}</div>
    ----------------------------------------------------------------------------------------------------
    <Hello1 ref ="hello1"/>
  </div>
</template>

<script>
import Hello1 from '@/components/Hello1.vue'
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  components: {
    Hello1
  },
  methods: {
    change2() {
    }
  }
}
</script>


<template>
  <!-- 这是孙组件 -->
<div >
  <div>这是孙组件,count的值是:{{this.count}}</div>
</div>
</template>

<script>

export default {
  name: 'Hello1',
  data() {
    return {
      count : "孙组件数据"
    }
  },
  methods: {
   
  },
}
</script>
<style>

</style>

4.2 过程分解

在这里插入图片描述
在这里插入图片描述

方式5:$attrs和$listeners

$attrs:包含了父作用域中没有被 prop 接收的所有属性(不包含class 和 style 属性)。这是其在使用是上的限制。在子组件中要通过这个去接收的条件。如果还要往下进行传递,需要v-bind来进行向下传递。自能是子类获取父类,同时只有定义出可以修改数据,中间传递组件无法修改值本身(可以通过下面的$listeners去源头进行修改)。

5.1 代码展示

<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>
      <button @click="change1">修改后代组件的值</button>
    </div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld ref="helloWorld" :age="this.age" :person="this.person" />
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },

  components: {
    HelloWorld
  },
  methods: {
    change1() {
      this.age = 19;
      this.person.name = "李四";
    }
  }
}
</script>

<template>
  <div>
    <!-- 这是子组件 -->
    <div>子组件中的基本数据类型age的值是:{{this.$attrs.age}}</div>
    <div>子组件中引用数据类型person的值是:{{this.$attrs.person.name}} --- {{this.$attrs.person.address}}</div>
    <div>
      <button @click="change2">修改后代组件的值</button>
    </div>
    ----------------------------------------------------------------------------------------------------
    <Hello1 ref ="hello1" v-bind="this.$attrs"/>
  </div>
</template>

<script>
import Hello1 from '@/components/Hello1.vue'
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  components: {
    Hello1
  },
  methods: {
    change2() {
      this.$attrs.age = 19;
    }
  }
}
</script>


<template>
  <!-- 这是孙组件 -->
<div >
  <div>孙组件中的基本数据类型age的值是:{{this.$attrs.age}}</div>
  <div>孙组件中引用数据类型person的值是:{{this.$attrs.person.name}} --- {{this.$attrs.person.address}}</div>
</div>
</template>

<script>

export default {
  name: 'Hello1',
  data() {
    return {
      count : "孙组件数据"
    }
  },
  methods: {
   
  },
}
</script>
<style>

</style>

5.2 过程分解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.3 $listeners的使用

$listnters:包含所有父组件中的 v-on 事件监听器 (不包含 .native 修饰器的)。其作用与$emit的功能相似。但是其可以不限制与父子组件之间来使用。
注意与.native进行区分,native是用于将原生事件绑定到特定组件中使用的

5.3.1代码展示
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>
      <button @click="change1">修改后代组件的值</button>
    </div>
    
    <div>
      <Hello2 @click.native="handleTest3" />
    </div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld ref="helloWorld" :age="this.age" :person="this.person" v-on="{handleTest1, handleTest2}" />
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
import Hello2 from '@/components/Hello2.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },

  components: {
    HelloWorld,
    Hello2
  },
  methods: {
    handleTest1(info) {
     console.log("有参数的传递处理{}", info);
    },
    handleTest2() {
      console.log("无参数的参数处理");
    },
    handleTest3() {
      console.log("原生的处理方式");
    }
  }
}
</script>

<template>
  <div>
    <!-- 这是子组件 -->
    <div>子组件中的基本数据类型age的值是:{{this.$attrs.age}}</div>
    <div>子组件中引用数据类型person的值是:{{this.$attrs.person.name}} --- {{this.$attrs.person.address}}</div>
    <div>
      <button @click="handle1">子类放在一个按钮来调用父类的handleTest1</button>
    </div>
    <div>
      <button  @click="handle3">原生的处理方式</button>
    </div>
    ----------------------------------------------------------------------------------------------------
    <Hello1 v-bind="this.$attrs" v-on="$listeners"/>
  </div>
</template>

<script>
import Hello1 from '@/components/Hello1.vue'
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  components: {
    Hello1
  },
  methods: {
    handle1() {
      // 两种写法
      this.$listeners.handleTest1(this.info);
      this.$emit('handleTest1', this.info);
    },
    handle3() {
      // this.handleTest3();
    }
  }
}
</script>


<template>
  <!-- 这是孙组件 -->
<div >
  <div>孙组件中的基本数据类型age的值是:{{this.$attrs.age}}</div>
  <div>孙组件中引用数据类型person的值是:{{this.$attrs.person.name}} --- {{this.$attrs.person.address}}</div>
  <button @click="handle2">子类放在一个按钮来调用父类的handleTest2</button>
</div>
</template>

<script>

export default {
  name: 'Hello1',
  data() {
    return {
      count : "孙组件数据"
    }
  },
  methods: {
    handle2() {
      // 两种写法
      this.$listeners.handleTest2();
      this.$emit("handleTest2");
    }
  },
}
</script>
<style>

</style>
<!--  -->
<template>
<div >
  <button>用于测试native的使用</button>
</div>
</template>

<script>

export default {
name: 'Hello2',
components: {},
data() {
return {

}
},
computed: {},
watch: {},
methods: {

},
created() {

},
mounted() {

},
}
</script>
<style>

</style>
5.3.2 过程分解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方式6:Bus和vuex暂时不添加

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1505749.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++的一些基础语法

前言&#xff1a; 本篇将结束c的一些基础的语法&#xff0c;方便在以后的博客中出现&#xff0c;后续的一些语法将在涉及到其它的内容需要用到的时候具体展开介绍&#xff1b;其次&#xff0c;我们需要知道c是建立在c的基础上的&#xff0c;所以c的大部分语法都能用在c上。 1.…

【Docker】容器的概念

容器技术&#xff1a;容器技术是基于虚拟化技术的&#xff0c;它使应用程序从一个计算机环境快速可靠地转移到另一个计算机环境中&#xff0c;可以说是一个新型地虚拟化技术。 一、docker容器 Docker:是一个开源地容器引擎Docker 是一种轻量级的容器化技术&#xff0c;其主要原…

雷赛控制卡获取轴当前位置的值不正确问题处理

现像 从雷赛控制卡中获取当前轴位置值时发现轴在向零点的右边走时显示的值是负数。正常来就一般是要反馈正数的。一般轴零点右边是正方向&#xff0c;限位是正限位&#xff0c;反馈的位置也应该是正数。 如果雷赛软件中的【单轴参数】中的基本设置中的【脉冲模式】设置的是对的…

【神经网络与深度学习】LSTM(Long Short-Term Memory)神经网络模型

概述 LSTM&#xff08;Long Short-Term Memory&#xff09;是一种特殊的循环神经网络&#xff08;RNN&#xff09;结构&#xff0c;通常被用于处理和学习时间序列数据。因此&#xff0c;LSTM属于深度学习领域中的一种神经网络模型。 在深度学习中&#xff0c;LSTM被广泛应用于…

【轮式平衡机器人】——TMS320F28069片内外设之eCAP

引入 TMS320F28069的eCAP&#xff08;增强型捕获模块&#xff09;是一个强大的外设&#xff0c;用于精确测量和捕获输入信号的事件和时间戳。 在电机控制、传感器数据采集和信号处理等应用中&#xff0c;eCAP模块可以用于测量霍尔传感器、编码器或其他数字输入信号的周期、频…

MySQL 的基础操作

数据库的基础操作 1. 库操作2. 表的操作3. 数据类型 数据库是现代应用程序中至关重要的组成部分&#xff0c;通过数据库管理系统&#xff08;DBMS&#xff09;存储和管理数据。 1. 库操作 创建数据库 创建数据库是开始使用数据库的第一步。下面是一些常见的创建数据库的示例&a…

为什么在镀膜时要测薄膜折射率?

在芯片制造中&#xff0c;镀膜工序&#xff08;PVD,CVD&#xff09;是必不可少的关键环节&#xff0c;薄膜的质量直接影响了芯片的性能。对这些薄膜的精细控制又离不开对其折射率的深入理解和精确测量。今天将对芯片制造中薄膜折射率的概念、测量方法&#xff0c;以及它在整个制…

Unmanaged PowerShell

简介 在渗透测试当中经常会使用到PowerShell来执行脚本, 但是直接使用PowerShell.exe是一个非常敏感的行为, EDR等产品对PowerShell.exe进程的创建监控的很密切, 并且随着PowerShell的渗透测试工具的普及, 越来越多的EDR会利用微软提供的AMSI接口对PS脚本进行扫描, 但是对于低…

力扣最热100题——56.合并区间

吾日三省吾身 还记得梦想吗 正在努力实现它吗 可以坚持下去吗 目录 吾日三省吾身 力扣题号&#xff1a;56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 题目描述 Java解法一&#xff1a;排序然后原地操作 具体代码如下 Java解法二&#xff1a;new一个list&#xf…

Pytorch学习 day04(Totensor、Normalize、Resize、Compose)

Totensor 把一个PIL格式的图片&#xff0c;或者ndarray格式的图片转换为tensor格式使用方法&#xff0c;如下&#xff1a; from PIL import Image from torchvision import transforms from torch.utils.tensorboard import SummaryWriterimg Image.open("images/00130…

算法——滑动窗口之找到字符串中所有的字母异位词,串联所有单词的子串

6.找到字符串中所有的字母异位词 题目:. - 力扣&#xff08;LeetCode&#xff09; 6.1如何快速判断两个字符串是否是异位词 假设现在有s1 aabca,s2 abaca,那么这两个就是异位词,容易想到的判断方法就是将两个字符串按照字典序排序,再依次比较,但是时间复杂度很高;我们看看…

python并发编程:IO模型比较分析

blocking和non-blocking的区别在哪&#xff0c;synchronous IO和asynchronous IO的区别在哪。 blocking vs non-blocking&#xff1a;调用blocking IO会一直block住对应的进程直到操作完成&#xff0c;而non-blocking IO在kernel还准备数据的情况下会立刻返回。 synchronous …

【R语言爬虫实战】抓取省市级城市常务会议内容

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

mysql如何开启手动提交事务

在mysql中&#xff0c;有一个变量autocommit&#xff0c;表示自动提交&#xff0c;默认为1&#xff0c;表示开启自动提交。通过以下命令查询 select autocommit;当autocommit为1时&#xff0c;任何一条sql语句都是一个事务&#xff0c;执行完由mysql自动提交。如果想自己决定什…

OS-Copilot:实现具有自我完善能力的通用计算机智能体

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ AI 缩小了人类间的知识和技术差距 论文标题&#xff1a;OS-Copilot: Towards Generalist Computer Agents with Self-Improvement 论文链接&#xff1a;https://arxiv.org/abs/2402.07456 项目主页&a…

32单片机基础:输入捕获测频率

接线图如下图所示&#xff1a; 我们复制之前写过的代码6-3 PWM驱动LED呼吸灯 在PWM模块中&#xff0c;执行的逻辑是&#xff0c;初始化TIM2的通道1&#xff0c;产生一个PWM波形&#xff0c;输出引脚是PA0&#xff0c;通过SetCompare1的函数&#xff0c;可以调节CCR1寄存器的值…

Memcached的重要性,如果防范Memcached DDOS攻击

一、Memcached简要 Memcached是一个开源的、高性能的、分布式内存对象缓存系统。它的主要目的是通过降低对数据库的访问来加速动态Web应用程序。 Memcached的用途非常广泛&#xff0c;它主要用于动态Web应用以减轻数据库负载。通过在内存中缓存数据和对象&#xff0c;Memcach…

pytorch_神经网络构建6

文章目录 强化学习概念实现qLearning基于这个思路,那么解决这个问题的代码如下 强化学习概念 强化学习有一个非常直观的表现&#xff0c;就是从出发点到目标之间存在着一个连续的状态转换&#xff0c;比如说从状态一到状态456&#xff0c;而每一个状态都有多种的行为&#xff…

2024/3/10 P1601高精加法

起因是本人在一个为数不多空闲的下午刷题ing&#xff0c;看到了AB problem。“就这&#xff1f;”从而忽略了高精这俩字&#xff0c;然后喜提40分。 于是开始研究何为高精。 #include<iostream> #include<string.h> #include<cstring>using namespace std; c…

数据结构与算法:链式二叉树

上一篇文章我们结束了二叉树的顺序存储&#xff0c;本届内容我们来到二叉树的链式存储&#xff01; 链式二叉树 1.链式二叉树的遍历1.1二叉树的前序&#xff0c;中序&#xff0c;后序遍历1.2 三种遍历方法代码实现 2. 获取相关个数2.1获取节点个数2.2获取叶节点个数2.3 获取树的…