【vue3】vue3组件通讯一篇就够了

父子组件通讯

props(父传子)

父组件使用子组件时,传自定义属性,子组件props接收:

//父组件
<template>
  <Parent msg="父组件消息" :wgh="{name:'wgh',age: 18}" :title="title" />
</template>
<script lang='ts' setup>
import Parent from '@/component/Parent.vue';
import {ref} from "vue";
const title = ref('父传子通讯');
</script>

//子组件
<template>
  <div>
    <h3>{{title}}</h3>
    <div>子组件没有props接收的自定义属性:{{$attrs}}</div>
    <div>自定义属性是引用类型:{{wgh}}</div>
  </div>
</template>
<script lang='ts' setup>
defineProps<{wgh:{name:string,age:number},title:string}>()
</script>

tips:子组件不定义props接收的属性,在attr中。

emit(子组件向父组件通讯)

子组件通过emit向父组件通讯,父组件通过自定义事件接收

//父组件
<template>
  <Parent
      @getInputVal="msg => childInput = msg"
      @getChildMsg="String => childMsg = msg" />
  <h3>展示子组件的消息</h3>
  <div>{{childMsg}}</div>
  <div>{{childInput}}</div>
</template>
<script lang='ts' setup>
import Parent from '@/component/Parent.vue';
import {ref} from "vue";
const childMsg = ref<string>();
const childInput = ref<string>();
</script>


//子组件
<template>
  <div>
    <h3>子组件向父级组件通讯</h3>
    <button @click="$emit('getChildMsg','你好,明天')">点击向父级通讯</button>
    <div>
      <input @input="e => $emit('getInputVal', e.target.value)" >
    </div>
  </div>
</template>

组件上的v-model

表单上的v-model都玩过,双向绑定用起来也很方便,组件添加v-model也是很重要的,实际上,这种通讯跟props&emit一样原理,只是通过emit修改v-model绑定的属性,可以省略父组件中自定义事件接收步骤,用起来很方便。

举个栗子:

//父
<template>
  <div>{{value}}{{title}}{{name}}</div>
  --------------------------
  <vModelTest class="com" style="font-size: 10px" v-model="value" v-model:title="title" v-model:name="name"></vModelTest>
</template>
<script lang="ts" setup>
  import { ref } from "vue";
  import vModelTest from '@/components/vModelTest.vue';
  const value = ref<number>(1);
  const title = ref<string>('我系渣渣辉');
  const name = ref<string>('wgh');
</script>

//子
<template>
    <div>11</div>
    <div class="box" style="color: red">
      <div class="box">
        <p>{{$attrs.modelValue}}</p>
        <p>{{$attrs.title}}</p>
        <p>{{$attrs.name}}</p>
      </div>
      <button @click="fn">emit button</button>
    </div>
</template>
<script setup lang="ts">
  //v-model子组件向父组件通讯可以不用props接收,v-model默认绑定modelValue属性名,可以给v-model取别名,同一个组件可以绑定多个v-model属性
  const emits = defineEmits(['update:modelValue','update:title','update:name'])

  const fn = () => {
    emits('update:modelValue', 5);
    emits('update:title', '我系古天乐');
    emits('update:name', 'wughuanghui');
  }
</script>

不明白还可看 给自己封装的组件添加v-model(vue3)

父组件访问子组件实例

  • 子组件定义方法变量,并且用defineExpose暴露出去;
  • 父组件中使用是给子组件添加ref属性,挂载完成即可访问到组件实例,包括暴露的变量方法。
//子组件
<template>
    <div :style="'color:'+ color">你好</div>
</template>
<script lang='ts' setup>
import {ref} from "vue";
import {mock} from 'mockjs';
const color = ref(mock('@color'));
const reColor = () => {
  color.value = mock('@color');
}
defineExpose({reColor})
</script>

//父组件
<template>
  <Parent ref="parentRef" />
  <button @click="parentRef.reColor()">按钮</button>
</template>
<script lang='ts' setup>
import Parent from '@/component/Parent.vue';
import {onMounted, ref} from "vue";
const parentRef = ref();

onMounted(() => {
  console.log(parentRef)
})
</script>

依赖注入(跨级组件通讯)

  • provide:提供一个值,可以被后代组件注入;
  • inject::注入一个由祖先组件或整个应用 (通过 app.provide()) 提供的值。
栗子:
//祖先组件
<template>
  <Parent></Parent>
</template>
<script lang='ts' setup>
import Parent from '@/component/Parent.vue';
import {provide, ref} from "vue";
const msg = ref('消息');
const sayHello = () => {
  console.log('我是祖先组件啦啦啦啦啦')
}
provide('provideObj', {
  msg,
  sayHi: sayHello
})
</script>


//父级组件
<template>
    <Children />
</template>
<script lang='ts' setup>
</script>

//注入组件
<template>
  <div>
    <div>子组件</div>
    <div>{{msg}}</div>
    <button @click="sayHi">按钮</button>
  </div>
</template>
<script lang='ts' setup>
import { onMounted,inject } from 'vue';
const { msg, sayHi } = inject<any>('provideObj')

onMounted(() => {
  console.log('子组件挂载完成');
})
</script>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3组件篇中的Button组件是一个基础组件,它在前端开发中非常常见,无论是C端还是B端的应用中都经常使用。这个组件具有以下功能点: 1. 可以设置主题色、按钮文字和禁用状态。 2. 可以设置按钮的尺寸,包括块级按钮。 3. 可以自定义按钮的颜色。 4. 可以选择按钮的形状,包括椭圆、矩形和圆形。 5. 可以添加点击事件。 6. 可以自定义按钮的文案。 7. 可以选择按钮的大小。 8. 可以安装和使用这个组件。 在使用Button组件时,可以在Vue模板中使用类似于以下的代码: ```html <button class="simple-button"> <span> <slot></slot> </span> </button> ``` 这个按钮组件的具体实现方式可以根据具体的需求进行调整,但以上是一个基本的示例代码。通过在Button组件上添加相应的样式和属性,就可以实现上述功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Vue3组件库实现 - Button组件篇](https://blog.csdn.net/vike_123/article/details/126053454)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [vue3 组件篇 Button](https://blog.csdn.net/glorydx/article/details/127165769)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值