vue 通信方式
2023-12-22 15:41:07
1、props 和 $emit 父组件向子组件传递数据是通过props传递的,子组件传递给父组件是通过$emit触发事件来做到的。
父组件
<!--父组件 Father.vue-->
<template>
<div>
<!--.sync 子组件可以修改父组件内容 <child :page.sync="page"> </child>
this.$emit("update:page", newVal) -->
<Child :articleList="articleList" @aaa="bbb"></Child>
</div>
</template>
<script>
import Child from './child'
export default {
name: "Father",
components:{
Child,
},
data(){
return {
articleList: ['红楼梦', '西游记', '三国演义'],
}
},
methods:{
bbb(evtValue){//获取子组件传来的数据
console.log('子组件传过来的数据',evtValue);//{age: 20,job: "web",name: "小李
子",sex: "male"}
}
}
}
</script>
子组件
<!--子组件 Child.vue-->
<template>
<div id="ctn-tex">
<ul>
<li v-for="(value,index) in articleList" :key="index">{{value}}</li>
</ul>
<input type="button" @click="emitIndex()" value="向父组件发送数据">
</div>
</template>
<script>
export default {
name: "Child",
props:['articleList'],//接收父组件传来的数据articleList
data(){
return {
info : {
name : "小李子",
age : 20,
sex : "male",
job : "web"
}
}
},
methods:{
emitIndex(){
let obj = this.info;
this.$emit('aaa', obj);//向父组件发射数据obj
}
}
}
</script>
2、$parent 和 $children 获取单签组件的父组件和当前组件的子组件。
3、$attrs 和 $listeners A -> B -> C。Vue2.4开始提供了$attrs和$listeners来解决这个问题。
4、父组件中通过 provide 来提供变量,然后在子组件中通过 inject 来注入变量。(官方不推荐在实际业务中适用,但是写组件库时很常用。)
<template>
<div class="outer">
<h3>爷组件</h3>
名字:<input v-model="name">
年龄:<input v-model.number="age" type="number">
电话:<input v-model="phoneNumber">
<child :name="name" :age="age" :phoneNumber="phoneNumber" @fromSun="fromSun"></child>
</div>
</template>
<script>
import Child from "./attrsChild";
export default {
name: 'Parent',
components: {Child},
provide:{
info:"提供数据"
},
data() {
return {
name: 'Tony',
age: 20,
phoneNumber: '1234567890',
fromSunData:''
}
},
methods:{
fromSun(payload) {
console.log("孙传祖", payload);
this.fromSunData = payload;
},
}
}
</script>
<style scoped>
.outer {
margin: 20px;
border: 2px solid red;
padding: 20px;
}
</style>
<template>
<div class="outer">
<h3>父组件</h3>
<div>获得顶层组件的name:{{name}}</div>
<grand-child v-bind="$attrs" v-on="$listeners"></grand-child>
</div>
</template>
<script>
import GrandChild from "./GrandChild";
export default {
components: {GrandChild},
props: ['name'],
created() {
console.log('Child=> $attrs: ' + JSON.stringify(this.$attrs));
}
}
</script>
<style scoped>
.outer {
margin: 20px;
border: 2px solid blue;
padding: 20px;
}
</style>
<template>
<div class="outer">
<h3>孙组件</h3>
<div>顶层组件的name:{{name}}</div>
<div>顶层组件的age:{{age}}</div>
<div>顶层组件的phoneNumber:{{phoneNumber}}</div>
<el-button size="small" type="primary" plain @click="sendToZu">孙传祖</el-button>
</div>
</template>
<script>
export default {
name: "GrandChild",
props: {
name: {
type: String
},
age: {
type: Number
},
phoneNumber: {
type: String
}
},
inject:['info'],
data(){
return{
data:'111'
}},
created() {
// this.parentAge = this.age; //也可以这样取值
console.log('GrandChild=> $attrs: ' + JSON.stringify(this.$attrs));
console.log("接收数据:", this.info) // 接收数据:提供数据
},
methods:{
sendToZu() {
// 孙组件能够触发爷组件的fromSun方法的原因还是因为父组件中有一个$listeners作为中间人,去转发这个事件的触发
this.$emit("fromSun", this.data);
},
}
}
</script>
<style scoped>
.outer {
margin: 20px;
border: 2px solid green;
padding: 20px;
}
</style>
5、$refs 获取组件实例。
6、envetBus 兄弟组件数据传递,这种情况下可以使用事件总线的方式。
7、vuex 状态管理
文章来源:https://blog.csdn.net/hx_1199/article/details/135152073
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!