vue3vue3组件通讯一篇就够了

Posted GHUIJS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue3vue3组件通讯一篇就够了相关的知识,希望对你有一定的参考价值。

父子组件通讯

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>valuetitlename</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>

以上是关于vue3vue3组件通讯一篇就够了的主要内容,如果未能解决你的问题,请参考以下文章

React全家桶看这一篇就够了

CSS选择器,看这一篇就够了

React -- 组件的生命周期 (这一篇就够了!!!)

Flutter 拖拽控件Draggable看这一篇就够了

Flutter 拖拽控件Draggable看这一篇就够了

大数据组件之Hive(Hive学习一篇就够了)