<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Vue3更新了很久了,但是之前專案都是用Vue2寫的,最近去官網look了一波,在這裡總結一下Vue3常用的通訊方式。
尤大大,不要再更新了,真的學不動了。
本文用的是Vue3.2版本的setup語法糖官網
父元件
<template> <div> <Child :msg="msg" :obj="obj" /> </div> </template> <script setup> import { ref, reactive } from 'vue' // Vue3.2版本setup語法糖引入元件不需要註冊便可以使用元件 import Child from './child.vue' const msg = ref('一隻豆豆') // 傳遞複雜型別資料 const obj = reactive({name: '豆豆'}) </script>
子元件
<template> <div></div> </template> <script setup> // Vue3.2版本setup語法糖 defineProps 不需要引入可以直接使用 const props = defineProps({ msg: { type: String, default: '' }, obj: { type: Object, default: () => {} } }) console.log('msg', props.msg); // 一隻豆豆 console.log('obj', props.obj.name); // 豆豆 </script>
父元件
<template> <div> <Child @myClick="myClick" /> </div> </template> <script setup> import { ref, reactive } from 'vue' import Child from './child.vue' const myClick = val => { console.log('val', val); // emit傳遞資訊 } </script>
子元件
<template> <div> <button @click="handleClick">click me</button> </div> </template> <script setup> // Vue3.2版本setup語法糖 defineEmits 不需要引入可以直接使用 const emit = defineEmits(['myClick']) // 如果有多個emit事件可以往陣列後邊新增即可 const handleClick = ()=>{ emit("myClick", "emit傳遞資訊") } </script>
在Vue3中就沒有EventBus了,可以使用mitt.js來替代
安裝
$ npm install --save mitt
bus.js
import mitt from 'mitt' export default mitt()
兄弟元件A emit觸發
<template> <div> <button @click="handleClick">click me</button> </div> </template> <script setup> import bus from './bus' const handleClick = () => { bus.emit('foo', '豆豆') } </script>
兄弟元件B on接收
<template> <div></div> </template> <script setup> import bus from './bus' bus.on('foo', e => { console.log('e', e) // '豆豆' }) </script>
Vue2版本是可以通過修飾符.sync讓子元件修改父元件的值,但是Vue3就取消這個修飾符,融合到v-model裡邊去了
父元件
<template> <div> <div>{{ name }}</div> <div>{{ age }}</div> <Child v-model:name="name" v-model:age="age" /> </div> </template> <script setup> import Child from './child.vue' import { ref } from 'vue' const name = ref('豆豆') const age = ref(20) </script>
子元件
<template> <div> <div></div> <button @click="handleChange">click me</button> </div> </template> <script setup> // 'update:name' 這樣寫在console裡面就不會有告警了 const emit = defineEmits(['update:name', 'update:age']) const handleChange = () => { emit('update:name', '一隻豆豆') emit('update:age', 18) } </script>
子元件通過 expose 暴露屬性和方法出去
父元件通過 ref 來獲取子元件的值和呼叫方法
父元件
<template> <div> <Child ref="myRef" /> <button @click="handleClick">click me</button> </div> </template> <script setup> import Child from './child.vue' import { ref } from 'vue' const myRef = ref(null) const handleClick = () => { console.log('myRef', myRef.value.name) // 豆豆 myRef.value.fn() // 一隻豆豆 } </script>
子元件
<template> <div> <div></div> </div> </template> <script setup> // Vue3.2版本setup語法糖 defineExpose 不需要引入可以直接使用 defineExpose({ name: '豆豆', fn () { console.log('一隻豆豆') } }) </script>
provide / inject 可以給後代元件傳參,巢狀多少層都沒問題
父元件
<template> <div> <Child /> </div> </template> <script setup> import Child from './child.vue' import { ref, provide } from 'vue' const name = ref('豆豆') provide('name', name) </script>
後代元件
<template> <div> <div>後代元件name {{ name }}</div> </div> </template> <script setup> import { inject } from 'vue' const name = inject('name') console.log('name', name.value) // 豆豆 </script>
Vue2使用 provide / inject 傳遞資料不是響應式的,所以只能通過傳遞一個物件資料才能變成響應式
Vue3使用 provide / inject傳遞資料就是響應式了,這就很便捷
父元件
<template> <div> <Child>豆豆</Child> </div> </template> <script setup> import Child from './child.vue' </script>
子元件
<template> <div> <slot></slot> </div> </template> <script setup></script>
<template> <div> <Child> 豆豆 <template #name> <div> <button>一隻豆豆</button> </div> </template> </Child> </div> </template> <script setup> import Child from './child.vue' </script>
子元件
<template> <div> // 普通插槽 <slot></slot> // 具名插槽 <slot name="name"></slot> </div> </template> <script setup></script>
效果圖
父元件
<template> <!-- v-slot="{scope}" 子元件返回的每一項資料 --> <Child v-slot="{ scope }" :arr="arr"> <div class="box"> <div>名字:{{ scope.name }}</div> <div>年齡:{{ scope.age }}</div> <div>愛好:{{ scope.like }}</div> </div> </Child> </template> <script setup> import { reactive } from 'vue' import Child from './child.vue' const arr = reactive([ { name: '張三', age: 18, like: '籃球' }, { name: '李四', age: 19, like: '排球' }, { name: '王五', age: 20, like: '足球' } ]) </script> <style lang="less"> .box { display: inline-block; width: 200px; border: dashed blue 1px; margin-right: 15px; padding: 10px; } </style>
子元件
<template> <div> <!-- :scope="item" 返回每一項 --> <slot v-for="item in arr" :scope="item" /> </div> </template> <script setup> const props = defineProps({ arr: { type: Array, default: () => [] } }) </script>
效果圖
到此這篇關於Vue3常用的通訊方式的文章就介紹到這了,更多相關Vue3通訊方式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45