首页 > 其他分享 >父子间组件通信

父子间组件通信

时间:2023-08-04 14:45:31浏览次数:31  
标签:methods 自定义 通信 父子 props 组件 data name

1、父传子( 定义:父传子使用的是 props )

① 首先确定父组件和子组件,然后在父组件中引入子组件,注册并使用;

父组件代码如下:

<template>
  <div>
    <h1>父组件</h1>
    <!-- 使用子组件 -->
    <ChildView></ChildView>
  </div>
</template>
<script>
// 引入子组件
import ChildView from "../components/child/child1.vue";
export default {
  name: "FatherView",
  components: {
    // 注册子组件
    ChildView,
  }
};
</script>

子组件代码如下:

<template>
  <div>
    <h1>子组件</h1>
  </div>
</template>
<script>
export default {
  name: "ChildView",
  components: {},
};
</script>

② 然后在父组件的data里面定义需要传递给子组件的数据以及methods里面的自定义事件;

//传递的数据
data() {
    return {
      list: [1, 2, 3, 4, 5],
      title: "wanjie",
      age: 22,
      sex: 1,
    };
  },
  methods: {
    // 自定义事件
    myHander(v) {
      console.log("myHander", v);
    },
  },

③ 通过给子组件标签上自定义数据和事件进行输送;

 <!-- props绑定的属性和事件 -->
    <ChildView
      :title="title"
      :list="list"
      :age="age"
      :sex="sex"
      @myHander="myHander"
    ></ChildView>

④ 子组件接受数据需要在script中定义一个与data平级的props,在props数组的内部来进行接收;

  //声明props
  //这里的两个值需要和父组件传过来的值相同,否则就会报错
  props: ["title", "list"],
  data() {
    return {};
  },

 ⑤ 子组件在页面上显示,直接this.属性名就可以获取到;

  <p>{{ this.title }}</p>

⑥ 如果没有在子组件的props里面声明接收,可以使用 $attrs 获取到传递的数据、$listeners 获取自定义事件;

console.log("child", this.list);    //输出结果为:child [1, 2, 3, 4, 5]
console.log("其他没有声明的props在:", this.$attrs);      //输出结果为:其他没有声明的props在: {age: 22, sex: 1}
console.log("没有使用的事件:event", this.$listeners);   //输出结果为:没有使用的事件:event {myHander: ƒ}

完整父组件代码如下:

<template>
  <div>
    <h1>父组件</h1>
    <!-- 使用子组件 -->
    <!-- props绑定的属性和事件 -->
    <ChildView
      :title="title"
      :list="list"
      :age="age"
      :sex="sex"
      @myHander="myHander"
    ></ChildView>
  </div>
</template>
<script>
// 引入子组件
import ChildView from "../components/child/child1.vue";
export default {
  name: "FatherView",
  components: {
    // 注册子组件
    ChildView,
  },
  mixins: [],
  props: {},
  data() {
    return {
      list: [1, 2, 3, 4, 5],
      title: "wanjie",
      age: 22,
      sex: 1,
    };
  },
  methods: {
    // 自定义事件
    myHander(v) {
      console.log("myHander", v);
    },
  },
};
</script>

完整子组件代码如下:

<template>
  <div>
    <h1>子组件</h1>
    <p>{{ this.title }}</p>
    <button type="button" @click="fn">父传子</button>
  </div>
</template>
<script>
export default {
  name: "ChildView",
  components: {
  },
  mixins: [],
  //声明props
  //这里的两个值需要和父组件传过来的值相同,否则就会报错
  props: ["title", "list"],
  data() {
    return {};
  },
  mounted() {
    // 打印测试
    console.log("child", this.title); //child wanjie
    console.log("child", this.list); //child [1, 2, 3, 4, 5]
    console.log("其他没有声明的props在:", this.$attrs); //其他没有声明的props在: {age: 22, sex: 1}
    console.log("没有使用的事件:event", this.$listeners); //没有使用的事件:event {myHander: ƒ}
  },
  methods: {
    fn() {
      this.$emit("myHander", 123);  
    },
  },
};
</script>

2、子传父( 定义:父传子使用的是 emit )

① 首先确定父组件和子组件,然后在父组件中引入子组件,注册并使用;

② 然后在子组件的data里面定义需要传递给父组件的数据以及methods里面的自定义事件;

③ 在子组件里面定义一个方法传值 $emit ("第一个参数为自定义方法名",第二个参数为需要传递的值);

  methods: {
    fn() {
      this.$emit("pass", this.name);
    },
  },

父组件代码如下:

<template>
  <div>
    <h1>父组件</h1>
    <!-- 使用子组件 -->
    <AboutList></AboutList>
  </div>
</template>
<script>
// 引入子组件
import AboutList from "../components/children/AboutList";
export default {
  name: "AboutView",
  // 注册引入的子组件
  components: {
    AboutList,
  },
  data() {
    return {};
  },
  methods: {},
};
</script>

子组件代码如下:

<template>
  <div>
    <h2>子组件</h2>
    <button type="button" @click="fn">子传父</button>
  </div>
</template>
<script>
export default {
  name: "AboutList",
  components: {},
  data() {
    return {
   // 传递给父组件的值
      list: [1, 2, 3, 4, 5],
      name: "wj",
      sex: 12,
    };
  },
  methods: {
   // 自定义事件
    fn() {
      this.$emit("pass", this.name);
    },
  },
};
</script>

④ 在父组件定义一个自定义事件接收子组件传递过来的事件、data里面定义一个来接收数据;

 data() {
    return {
      dataList: [],
    };
  },
  methods: {
    getList(val) {
      this.dataList = val;
      console.log("子组件传递回来的数据", this.dataList);
    },
  },

注意:自定义事件的等于号前面@pass需和子组件自定义方法名一样;等于号后面为父组件自定义方法名,需和下方的方法名对应。

子组件代码:

  methods: {
    fn() {
      this.$emit("pass", this.name);
    },
  },

父组件代码:

 <AboutList @pass="getList"></AboutList>

 // 接收自定义事件
 methods: {
    getList(val) {
      this.dataList = val;
      console.log("子组件传递回来的数据", this.dataList);
    },
  },

完整的父组件代码如下:

<template>
  <div>
    <h1>父组件</h1>
    <!-- 使用子组件 -->
    <AboutList @pass="getList"></AboutList>
    <p>name:{{ dataList }}</p>
  </div>
</template>
<script>
// 引入子组件
import AboutList from "../components/children/AboutList";
export default {
  name: "AboutView",
  // 注册引入的子组件
  components: {
    AboutList,
  },
  data() {
    return {
      dataList: [],
    };
  },
  methods: {
    getList(val) {
      this.dataList = val;
      console.log("子组件传递回来的数据", this.dataList);  //输出结果为:子组件传递回来的数据 wj
    },
  },
};
</script>

完整的子组件代码如下:

<template>
  <div>
    <h2>子组件</h2>
    <button type="button" @click="fn">子传父</button>
  </div>
</template>
<script>
export default {
  name: "AboutList",
  components: {},
  data() {
    return {
      list: [1, 2, 3, 4, 5],
      name: "wj",
      sex: 12,
    };
  },
  methods: {
    fn() {
      this.$emit("pass", this.name);
    },
  },
};
</script>

 

标签:methods,自定义,通信,父子,props,组件,data,name
From: https://www.cnblogs.com/wanker/p/17605534.html

相关文章

  • vue实现一个鼠标滑动预览视频封面组件(精灵图版本)
    说在前面......
  • 三菱Q系列PLC串口和台达变频器进行RTU通信
    ▎一、动作描述1.三菱Q系列串口和台达变频器进行RTU通信2.通信内容:正反转停止控制▎二、前置基础1.Q系列串口通讯重要指令:U:模块的起始IO编号(以16进制数4位表示时的高3位)例如:起始IO为0070——U7n1:K1表示第1通道,K2表示第2通道n2:协议连续执行数,最大8个S:起始软元件(看下......
  • uniapp 使用camera组件IOS圆角不生效问题
    <viewclass="cameraViewgui-margin-top"><cameraclass="camera-box"device-position="front"flash="off"></camera></view>.cameraView{width:600rpx;height:600rpx;border-radius:50%;bord......
  • uniapp使用elementui表格等组件
    uniapp使用elementui表格安装element-uinpmielement-ui-S引入Element直接使用组件<el-table:data="list"style="width:100%"size="small"border> <el-table-columnprop="status"label="签约日期"width......
  • LabVIEW通过ADS OCX实现与倍福TwinCAT3的通信测试
    LabVIEW通过ADS实现与倍福TwinCAT3通信的方法包括:ADSDLLADSOCXADSNET对于变量的读取分为定时轮询方式和事件触发方式。又可分为按地址读取和按变量名读取。本文介绍ADSOCX方法,分别介绍定时轮询方式和事件触发方式。读取状态-定时轮询192.168.0.105.1.1为NetId的地址(通......
  • Qt 通过ADS实现倍福TwinCAT通信
    ADS通信分为两种:同步方式和异步方式。同步方式ADS客户端向ADS服务器发送ADS请求,在通信过程中客户端程序停止执行,直到获得ADS服务器返回的响应又可分为变量名方式和地址方式异步方式ADS客户端向ADS服务器发送ADS请求,同时客户端继续自己的工作。ADS服务器处理......
  • vue--day51----todolist 中App.vue 和 MyItem.vue 类似 父亲和子通信 通过全局事件总
    1.mainjs/***该文件是整个项目的入口文件*///引入VueimportVuefrom'vue'//引入App组件他是所有组件的父组件importAppfrom'./App.vue'//关闭vue的生产提示Vue.config.productionTip=false//constDemo=Vue.extend({})//constd=newDemo();//Vue.pr......
  • 【设计模式】装饰器模式Decorator:在基础组件上扩展新功能
    (目录)装饰器模式看上去和适配器模式、桥接模式很相似,都是使用组合方式来扩展原有类的,但其实本质上却相差甚远呢。简单来说,适配器模式侧重于转换,而装饰模式侧重于动态扩展;桥接模式侧重于横向宽度的扩展,而装饰模式侧重于纵向深度的扩展。原理装饰模式的原始定义是:允许动态地向......
  • Apache Rocket MQ 组件 (泛型应用)
     一、实现 importjava.util.Map;importjava.util.concurrent.ConcurrentHashMap;importorg.apache.commons.lang3.StringUtils;importorg.apache.rocketmq.client.consumer.DefaultMQPushConsumer;importorg.apache.rocketmq.client.consumer.listener.MessageList......
  • 子组件调用父组件方法带参数
    子组件调用父组件方法带参数父组件###template<DBTableSelectref="DBTableEdit"@customEvent="handleCustomEvent"@close="closedDrawDBTable"v-if="showDrawDBTable"/>###jsimportDBTableS......