vue3+ts 中的几种通信方式及使用方式 (使用setup语法糖操作)

我现在比较常用的是这四种: 父子通信(props),子父通信(emit),vuex,事件总线

1.父传子:

父组件中:

<template>
  <h2>父组件</h2>
  <hr>
  <Son :num="num" :arr="array" ></Son>
</template>

<script lang="ts" setup>
import {ref} from 'vue'
import Son from "./Son.vue";

let num = ref(6688)
let array = ref([11, 22, 33, 44])
</script>

子组件中:

<template>
  <h2>子组件</h2>
  {{props.num}}--{{props.arr}}
</template>

<script lang="ts" setup>
let props = defineProps({
  num: Number,
  arr: {
    type: Array,
    default: () => [1, 2, 3, 4]
  }
})
</script>

2.子传父:

子组件中:

<template>
  <h2>子组件</h2>
  <button @click="sendMsg">向父组件传递数据</button>
</template>

<script lang="ts" setup>
import {ref} from 'vue'

const emit = defineEmits(["son_sendMsg"]);
const msg = ref("子组件传递给父组件的数据")

function sendMsg() {
  emit("son_sendMsg", msg.value)
}
</script>

父组件中:

<template>
  <h2>父组件</h2>
  {{ message }}
  <hr>
  <Son @son_sendMsg="fun"></Son>
</template>

<script lang="ts" setup>
import {ref} from 'vue'
import Son from "./Son.vue"

let message = ref("")
function fun(msg) {
  message.value = msg
}
</script>

3.vuex 状态管理

创建 store/index.js

import {creatStore} from 'vuex'

const store = creatStore({
   state: {
     userInfo: {
       name:'hello'
     } 
   },
mutations: {
  setName(state,val){
   state.userInfo.name = val
  }
},
actions: {},
getters: {}

})


export default store

 在组件中使用: 

1.直接在标签中使用:

<p>{{$store.state.userInfo.name}}</p>

或者代码中更改数据:

<el-button @click="nameChange">更改Vuex名字</el-button>

<script lang="ts" setup>
 import {ref,onMounted,watch} from 'vue';
//状态vuex
import {useStore} from 'vuex'; 

const store = useStore();

function nameChange(){
    store.commit('setName','王二麻子')
}



</script>

获取更新的数据

<el-button >{{name}}</el-button>

<script lang="ts" setup>
 import {ref,onMounted,watch} from 'vue';
//状态vuex
import {useStore} from 'vuex'; 

const store = useStore();

//响应式数据
const name = ref(store.state.userInfo.name);


//监听数据
watch(() =>store.state.userInfo.name,(newVal,oldVal) =>{name.value = newVal})


</script>

4.事件总线:

  • Vue3移除了$on $off等自带的自定义事件相关方法,因此在vue3中他推荐我们下载mitt库来使用事件总线传递数据

安装: 

npm install mitt

这里需要几个步骤: 1,定义一个工具库eveBus.js

import mitt from "mitt";

// export default mitt();

//也可以写完整的

const emitter = mitt();
//每调用一个mitt,都是一个总线,所以这里为什么要封装为一个工具库,就是只使用一个总线

export default emitter;

2.在组件中使用

one.vue

<template>
  <p>从Two接收到的数据[{{receiveData}}]</p>
</template>

<script setup>
import { ref } from 'vue';
// 引入总线
import emitter from "@/utils/eveBus";
export default {
  name: 'One',
  const receiveData = ref([]);
    // 绑定总线(添加订阅)
  emitter.on('giveOne',(value)=>{
   // 回调函数
   receiveData.value = value;
  })
}
</script>

two.vue

<template>
  <button @click="giveValue">传递给One值</button>
</template>

<script setup>
import emitter  from '@/utils/eveBus';
export default {
  name: 'Two',
    function giveValue(){
      // 调用总线,发布订阅
      emitter.emit('giveOne',"我是从Two传递过来的值");
    };
}
</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奈子米

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值