Vue3.0实现todolist之父子组件之间传值

简介: Vue3.0实现todolist之父子组件之间传值

1:首先在views底下新建一个detail组件

<template>
  <div>
    <h1>我是detail组件</h1>
    <child></child>
    </div>
</template>
<script>
import { defineComponent,ref } from "vue";
import child from '../components/child/Child.vue'
export default defineComponent({
  name: "Detail",
  components:{
    child
  },
  setup() {
  },
});
</script>

在components创建child组件

<template>
  <div>
    <h1>我是child组件</h1>
  </div>
</template>
<script>
import { defineComponent, ref } from "vue";
export default defineComponent({
  name: "Child",
  setup() {},
});
</script>

在router/index.js里面添加新建组件的路径

{
      path: "/detail",
      name: "Detail",
      component: () => import("../views/Detail.vue"),
    },

在浏览器打开

可以看见

detail成功引进child组件运行结果

1:父组件传递给子组件数据

首先定义父组件Detail 里面的一些数据

setup() {
    let msg=ref('这是父组件')
    return{
        msg
    }
  },

在child子组件的标签上通过动态绑定属性的方式 :属性名

属性名=一个属性的值 通常是一样的

<h1>我是detail组件</h1>
    <child :msg='msg'></child>

Detail.vue

<template>
  <div>
    <h1>我是detail组件</h1>
    <child :msg='msg'></child>
    </div>
</template>
<script>
import { defineComponent,ref } from "vue";
import child from '../components/child/Child.vue'
export default defineComponent({
  name: "Detail",
  components:{
    child
  },
  setup() {
    let msg=ref('这是父组件')
    return{
        msg
    }
  },
});
</script>

这样数据就传递给子组件了

在子组件里面改怎么接收?

子组件接收数据

使用属性:props 专门用来接收父组件传递过来的参数的,对传递过来的数据进行校验,必须是string类型的

export default defineComponent({
  name: "Child",
  //接收父组件传递过来的参数
  //props接收的数据也不能直接改
  props: {
    msg: {
      //数据类型校验
      type: String,
    },
  },
  setup(props) {
    console.log(props.msg);
  },
});

props接收的数据直接可以用

<div>
    <h1>我是child组件</h1>
    父组件传递过来的数据:{{ msg }}
 </div>

Child.vue

<template>
  <div>
    <h1>我是child组件</h1>
    父组件传递过来的数据:{{ msg }}
  </div>
</template>
<script>
import { defineComponent, ref } from "vue";
export default defineComponent({
  name: "Child",
  //接收父组件传递过来的参数
  //props接收的数据也不能直接改
  props: {
    msg: {
      //数据类型校验
      type: String,
    },
  },
  setup(props) {
    console.log(props.msg);
  },
});
</script>

查看结果

2:子组件传递参数给父组件

子组件通过分开事件的方式,通过ctx.emit分发事件

Child.vue

<template>
  <div>
    <h1>我是child组件</h1>
    父组件传递过来的数据:{{ msg }}
    <button @click="send">传值给服组件</button>
  </div>
</template>
<script>
import { defineComponent, ref } from "vue";
export default defineComponent({
  name: "Child",
  //接收父组件传递过来的参数
  //props接收的数据也不能直接改
  props: {
    msg: {
      //数据类型校验
      type: String,
    },
  },
  setup(props) {
    console.log(props.msg);
    let childMsg = ref("我是子组件的数据内容");
    let send = () => {
      //子组件通过分开事件的方式,通过ctx.emit分发事件
      //emit第一个参数是事件名称,第二个参数是传递的数据
      //相当于点击按钮,就通过ctx.emit分发了一个叫send的事件,并且把childMsg这个数据传递给父组件了
      ctx.emit("send", childMsg.value);
    };
    return{
      childMsg,
      send
    }
  },
});
</script>

父组件接收子组件的数据

父组件中绑定自定义事件(在子组件中分发的事件名称send)

第一个send是子组件分发过来的,第二个send是父组件自己的

<template>
  <div>
    <h1>我是detail组件</h1>
    <child :msg='msg' @send='send'></child>
    </div>
</template>
<script>
import { defineComponent,ref } from "vue";
import child from '../components/child/Child.vue'
export default defineComponent({
  name: "Detail",
  components:{
    child
  },
  setup() {
    let msg=ref('这是父组件的一些数据')
    let send=(val)=>{
        console.log(val)
    }
    return{
        msg,
        send
    }
  },
});
</script>

在这里分发事件不一定是要通过点击事件,也可以通过onMounted页面加载时候通过分发事件的方式

如果传递的数据是多个

可以通过数组的方式

let childMsg = ref("我是子组件的数据内容");
    let  childNmu=ref(10)
onMounted(()=>{
     // ctx.emit("send", childMsg.value);
     ctx.emit("send", [childMsg.value,childNmu.value]);
    })

通过数组的方式 的运行结果

还可以通过对象的方式

onMounted(() => {
      // ctx.emit("send", childMsg.value);
      //通过数组方式传值
      //ctx.emit("send", [childMsg.value,childNmu.value]);
      //  通过对象的方式传值
      ctx.emit("send", {
        msg: childMsg.value,
        num: childNmu.value,
      });
    });

运行结果

Child.vue

<template>
  <div>
    <h1>我是child组件</h1>
    父组件传递过来的数据:{{ msg }}
    <button @click="send">点击传值给父组件</button>
  </div>
</template>
<script>
import { defineComponent, onMounted, ref } from "vue";
export default defineComponent({
  name: "Child",
  //接收父组件传递过来的参数
  //props接收的数据也不能直接改
  props: {
    msg: {
      //数据类型校验
      type: String,
    },
  },
  setup(props, ctx) {
    console.log(props.msg);
    let childMsg = ref("我是子组件的数据内容");
    let childNmu = ref(10);
    // let send = () => {
    //   //子组件通过分开事件的方式,通过ctx.emit分发事件
    //   //emit第一个参数是事件名称,第二个参数是传递的数据
    //   //相当于点击按钮,就通过ctx.emit分发了一个叫send的事件,并且把childMsg这个数据传递给父组件了
    //   ctx.emit("send", childMsg.value);
    // };
    onMounted(() => {
      // ctx.emit("send", childMsg.value);
      //通过数组方式传值
      //ctx.emit("send", [childMsg.value,childNmu.value]);
      //  通过对象的方式传值
      ctx.emit("send", {
        msg: childMsg.value,
        num: childNmu.value,
      });
    });
    return {
      childMsg,
      //send
    };
  },
});
</script>
相关文章
|
7月前
|
JavaScript 前端开发 API
浅谈Vue3——父子组件传值
浅谈Vue3——父子组件传值
298 0
|
7月前
|
存储
第42节: Vue3 组件之间传值
第42节: Vue3 组件之间传值
109 1
|
7月前
|
JavaScript
Vue父子组件传值
<!-- 父组件向子组件传地值 -->
42 2
|
7月前
|
JavaScript
【vue实战】父子组件互相传值
【vue实战】父子组件互相传值
50 1
|
JavaScript
Vue的非父子组件之间传值
全局事件总线 一种组件间通信的方式,适用于任意组件间通信
|
7月前
vue3中的父子间传值
vue3中的父子间传值
58 0
|
7月前
|
JavaScript
vue组件之间互相传值
vue组件之间互相传值
88 0
|
7月前
|
JavaScript 前端开发 开发工具
Vue传家宝:父子组件传值指南
Vue传家宝:父子组件传值指南
84 0
|
JavaScript
Vue中父子组件传值
先在⽗组件中给⼦组件的⾃定义属性绑定⼀个⽗组件的变量