目录

      父传子:

      1、 在父组件的子组件标签上通过 :传递到子组件的数据名=”需要传递的数据”

      在这里为了大家区分我将父组件中的数据定义为 : fatherdata  ,

      子组件需要接收的数据定义为: sondata 。

      // 父组件
      <template>
        <div class="about">
          {{fatherdata}}
          <!-- 父传子 -->
          <!-- 1、 在父组件的子组件标签上通过 :传递到子组件的数据名="需要传递的数据" -->
          <children :sondata="fatherdata"></children>
        </div>
      </template>
       
      <script>
      import children from "@/components/children"
      import { definecomponent,reactive,torefs } from "vue";
      export default definecomponent({
        components:{
          children,
        },
      name:"about",
      setup(){
        const state = reactive({
          fatherdata:"hello"
        })
        return {
          ...torefs(state)
        }
      }
       
      })
      </script>

      2、子组件依旧通过 props 来接收并且在模版中使用

      那么大多数情况下都会去通过父组件传递到子组件中的数据,根据这个数据去做一些特定的功能或者请求数据等等。

      在 setup 钩子中第一个参数 props 就可以访问到父组件传递的数据,那么在函数中也是通过:  props.父组件传递数据的名称   来操作该数据。

      setup函数接收props作为其第一个参数,props对象是响应式的(单向的父—>子),watcheffect或watch会观察和响应props的更新。不要对props对象进行解构,那样会失去响应性。在开发过程中,props对象对用户空间代码时不可变的,用户尝试修改props时会触发警告。

      // 子组件
      <template>
        <div class="children">
          <!-- 3、在子组件模版中使用 -->
          {{sondata}}
        </div>
      </template>
      <script>
      export default {
      name:"children",
      // 2、子组件通过 props 来接收
        props:["sondata"],
        setup(props){
          function childrenbut(){
            // props.sondata  可以访问到父组件传递的数据
            console.log(props.sondata);
          }
          return {
            childrenbut
          }
        }
      }
      </script>

      子传父:

      1、子组件触发事件通过 setup 的第二个参数 context.emit 来实现子传父 

      context 上下文对象。

      // 子组件
      <template>
        <div class="children">
          {{sondata}}
          <!-- 1、触发事件 -->
          <button @click="childrenbut">子组件按钮</button>
        </div>
      </template>
      <script>
      export default {
      name:"children",
        setup(props,context){
          function childrenbut(){
            console.log(context);
            // 2、通过context.emit 实现子传父
            // 第一个参数为 方法名,第二个参数为 需要传递的数据
            context.emit("change",'world')
          }
          return {
            childrenbut,
          }
        }
      }
      </script>

      context 也可以使用结构的形式这样写

      // 子组件
      <script>
      export default {
      name:"children",
        // 通过结构 之后直接写 emit {emit}
        setup(props,{emit}){
          function childrenbut(){
            // 省去 context.emit
            emit("change",'world')
          }
          return {
            childrenbut,
          }
        }
      }
      </script>

      总结

      在 vue3 中无论是父传子还是子传父其实与 vue2 中都相差无几,

      思想大多一样,不一样的是 vue3 需要通过调用各种各样的钩子来实现传参