• vue3组件通信使用


    目录

    首先,我们先了解为什么要组件拆分?

    组件拆分的流程?

    子组件中为什么要使用defineComponent方法?

     父传子

    父组件

    子组件

    子传父

    子组件

    父组件

    provide和inject方法

    传递数据的组件

    子组件

    孙子组件

    组件通信的双向绑定

     父组件

    子组件

    首先,我们先了解为什么要组件拆分?

            组件拆分的目的就是为了让我们复用代码,节省我们的代码量,把共同的功能封装到一个组件中,然后在各个组件中使用

    组件拆分的流程?

            首先,把要拆分的数据单独拆分到一个文件中,作为子组件

            在父组件中import导入子组件,components进行组件的注册

            父组件使用注册子组件的标签

    子组件中为什么要使用defineComponent方法?

            语法严谨主要是用来检测ts的语法结构的

     父传子

    流程简介:

    先在父组件中的子组件上绑定一个自定义属性

    子组件中通过props接收数据,可以验证数据类型,设置默认值

    接收的数据可以直接使用

    父组件

    1. <template>
    2. <input type="text" placeholder="请输入你喜欢的明星">
    3. <List :list="list" ></List>
    4. </template>
    5. <script>
    6. import {reactive } from 'vue'
    7. import List from '../views/List.vue' //引入子组件
    8. export default {
    9. name:'hello',
    10. //手动挂载子组件
    11. components:{List},
    12. setup(props,context){
    13. let list=reactive(['蔡徐坤','张云龙','秦霄贤','烧饼'])
    14. //return返回
    15. return{
    16. list
    17. }
    18. }
    19. }
    20. </script>

    子组件

    1. <template>
    2. <div>
    3. <ul>
    4. <li v-for="(item,index ) in list" :key="index">{{item}}</li>
    5. </ul>
    6. </div>
    7. </template>
    8. <script>
    9. export default{
    10. props:{
    11. list:{
    12. type:Array,
    13. }
    14. },
    15. setup(){
    16. }
    17. }
    18. </script>

    在props中接收父组件中传递过来的值

    子传父

    流程简介:

            先在子组件中定义一个方法,方法中调用emit方法

            emit方法有两个参数,第一个参数是自定义事件,第二个参数是 要传递的参数

            父组件中,子组件的标签上绑定一个事件,调用自定义方法,方法的形参就是传递的数据

    子组件

    1. <template>
    2. <div>
    3. <ul>
    4. <li v-for="(item,index ) in list" :key="index" @click="select(item)">{{item}}</li>
    5. </ul>
    6. </div>
    7. </template>
    8. <script>
    9. export default{
    10. //父传子接受子组件中的数据,渲染到页面
    11. props:{
    12. list:{
    13. type:Array,
    14. }
    15. },
    16. setup(props,{emit}){
    17. //点击触发select方法
    18. const select=(item)=>{
    19. console.log(item);
    20. // 会把数据传递给父组件中
    21. emit('sel',item)
    22. }
    23. return {select}
    24. }
    25. }
    26. </script>

    父组件

    1. <template>
    2. <input type="text" placeholder="请输入你喜欢的明星">
    3. <List :list="list" @sel="sel" ></List>
    4. </template>
    5. <script>
    6. import { reactive } from 'vue'
    7. import List from '../views/List.vue'
    8. export default {
    9. name:'hello',
    10. components:{List},
    11. setup(){
    12. let list=reactive(['蔡徐坤','张云龙','秦霄贤','烧饼'])
    13. const sel=(data)=>{
    14. console.log(data);
    15. }
    16. return{
    17. list,sel
    18. }
    19. }
    20. }
    21. </script>

    provide和inject方法

    provide()inject() 可以实现嵌套组件之间的数据传递。这两个函数只能在 setup() 函数中使用。父级组件中使用 provide() 函数向下传递数据;子级组件中使用 inject() 获取上层传递过来的数据

    传递数据的组件

    1. <template>
    2. <div>
    3. <h3>{{name}}</h3>
    4. <Son></Son>
    5. </div>
    6. </template>
    7. <script>
    8. import Son from '../views/Son.vue'
    9. import { provide,reactive } from 'vue'
    10. export default {
    11. components:{
    12. Son
    13. },
    14. setup(){
    15. let name=reactive('张三')
    16. provide('name',name)
    17. return {
    18. name
    19. }
    20. }
    21. }
    22. </script>

    子组件

    1. <template>
    2. <div>
    3. <Son1></Son1>
    4. </div>
    5. </template>
    6. <script>
    7. import Son1 from '../views/Son1.vue'
    8. import {inject} from 'vue'
    9. export default {
    10. components:{
    11. Son1
    12. },
    13. setup(){
    14. let name=inject('name')
    15. console.log(name);
    16. return {name}
    17. }
    18. }
    19. </script>

    孙子组件

    1. <template>
    2. <div>
    3. <h3>{{names}}</h3>
    4. </div>
    5. </template>
    6. <script>
    7. import { inject } from 'vue'
    8. export default {
    9. setup(){
    10. let names=inject('name')
    11. return {names}
    12. }
    13. }
    14. </script>

    组件通信的双向绑定

    1. 在组件通信的传递属性的时候增加个v-model指令v-model:username=“Name"

    2. 子组件中文本框接受数据,绑定事件$emit("update:username",传递更新的值)

    v-model 和$emit() 中update配合使用

    vue3中去掉了.native修饰符,所以说子传父的过程中无法辨别自定义事件是否原生事件,如果我们emit传递的事件是原生js事件名的话,这个时候父组件中事件可能会多次执行

    这个时候可以在子组件中增加emits属性配置,配置子组件向父组件传递或者定义的自定义事件

     父组件

    1. <template>
    2. <div>
    3. <input type="text" class="inp" v-model="username"/>
    4. <Son v-model:username="username"></Son>
    5. </div>
    6. </template>
    7. <script>
    8. import Son from '../views/Son.vue'
    9. import { reactive } from 'vue'
    10. export default {
    11. components:{
    12. Son
    13. },
    14. setup(){
    15. let username=reactive('')
    16. return {
    17. username
    18. }
    19. }
    20. }
    21. </script>

    子组件

    1. <template>
    2. <div>
    3. <input type="text" :value="username" @input="(e) => $emit('update:username', e.target.value)" />
    4. </div>
    5. </template>
    6. <script>
    7. import { inject } from 'vue'
    8. export default {
    9. props: ["username"],
    10. setup() {
    11. }
    12. }
    13. </script>

  • 相关阅读:
    [工业互联-8]:PLD编程快速概览、PLD五种编程语言与七款常见的PLC编程软件
    python推导式&全局变量&多参数传参&装饰器
    ubuntu20.4下配置esp开发环境
    WordPress 插件推荐:菜单缓存插件——Menu Caching
    项目讲解之常见安全漏洞
    OSCS开源安全周报第13期:Exchange 高危漏洞公开
    python 循环引用的解决方法
    [附源码]Java计算机毕业设计SSM服装创意定制管理系统
    Lora训练的参数和性能
    基于SSM的疫情期间高校师生外出请假管理系统设计与实现
  • 原文地址:https://blog.csdn.net/qq_60976312/article/details/128086213