最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3常用的通訊方式總結(jié)與實(shí)例代碼

 更新時(shí)間:2022年05月29日 09:28:35   作者:一只豆豆  
Vue.js中一個(gè)很重要的知識(shí)點(diǎn)是組件通信,不管是業(yè)務(wù)類的開(kāi)發(fā)還是組件庫(kù)開(kāi)發(fā),都有各自的通訊方法,下面這篇文章主要給大家介紹了關(guān)于Vue3常用的通訊方式的相關(guān)資料,需要的朋友可以參考下

前言

Vue3更新了很久了,但是之前項(xiàng)目都是用Vue2寫(xiě)的,最近去官網(wǎng)look了一波,在這里總結(jié)一下Vue3常用的通訊方式。
尤大大,不要再更新了,真的學(xué)不動(dòng)了。

本文用的是Vue3.2版本的setup語(yǔ)法糖官網(wǎng)

props

父組件

    <template>
      <div>
          <Child :msg="msg" :obj="obj" />
      </div>
    </template>

    <script setup>
        import { ref, reactive } from 'vue'
        // Vue3.2版本setup語(yǔ)法糖引入組件不需要注冊(cè)便可以使用組件
        import Child from './child.vue'

        const msg = ref('一只豆豆')
        // 傳遞復(fù)雜類型數(shù)據(jù)
        const obj = reactive({name: '豆豆'})
    </script>

子組件

    <template>
      <div></div>
    </template>

    <script setup>
        // Vue3.2版本setup語(yǔ)法糖 defineProps 不需要引入可以直接使用
        const props = defineProps({
            msg: {
                type: String,
                default: ''
            },
            obj: {
                type: Object,
                default: () => {}
            }
        })
        console.log('msg', props.msg); // 一只豆豆
        console.log('obj', props.obj.name); // 豆豆
</script>

$emit

父組件

    <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語(yǔ)法糖 defineEmits 不需要引入可以直接使用
        const emit = defineEmits(['myClick']) // 如果有多個(gè)emit事件可以往數(shù)組后邊添加即可
        
        const handleClick = ()=>{
            emit("myClick", "emit傳遞信息")
        }
    </script>

EventBus

在Vue3中就沒(méi)有EventBus了,可以使用mitt.js來(lái)替代
安裝

$ npm install --save mitt

bus.js

    import mitt from 'mitt'
    export default mitt()

兄弟組件A emit觸發(fā)

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

v-model

Vue2版本是可以通過(guò)修飾符.sync讓子組件修改父組件的值,但是Vue3就取消這個(gè)修飾符,融合到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' 這樣寫(xiě)在console里面就不會(huì)有告警了
        const emit = defineEmits(['update:name', 'update:age'])
        const handleChange = () => {
          emit('update:name', '一只豆豆')
          emit('update:age', 18)
        }
    </script>

expose / ref

子組件通過(guò) expose 暴露屬性和方法出去
父組件通過(guò) ref 來(lái)獲取子組件的值和調(diào)用方法

父組件

    <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語(yǔ)法糖 defineExpose 不需要引入可以直接使用
        defineExpose({
          name: '豆豆',
          fn () {
            console.log('一只豆豆')
          }
        })
    </script>

provide / inject

provide / inject 可以給后代組件傳參,嵌套多少層都沒(méi)問(wèn)題

父組件

    <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 傳遞數(shù)據(jù)不是響應(yīng)式的,所以只能通過(guò)傳遞一個(gè)對(duì)象數(shù)據(jù)才能變成響應(yīng)式
Vue3使用 provide / inject傳遞數(shù)據(jù)就是響應(yīng)式了,這就很便捷

插槽 slot

普通插槽

父組件

    <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}" 子組件返回的每一項(xiàng)數(shù)據(jù) -->
      <Child v-slot="{ scope }" :arr="arr">
        <div class="box">
          <div>名字:{{ scope.name }}</div>
          <div>年齡:{{ scope.age }}</div>
          <div>愛(ài)好:{{ 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" 返回每一項(xiàng) -->
        <slot v-for="item in arr" :scope="item" />
      </div>
    </template>

    <script setup>
        const props = defineProps({
          arr: {
            type: Array,
            default: () => []
          }
        })
    </script>

效果圖

結(jié)語(yǔ)

到此這篇關(guān)于Vue3常用的通訊方式的文章就介紹到這了,更多相關(guān)Vue3通訊方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue3中如何使用ts

    vue3中如何使用ts

    這篇文章主要介紹了vue3中如何使用ts,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Vue數(shù)據(jù)驅(qū)動(dòng)試圖的實(shí)現(xiàn)方法及原理

    Vue數(shù)據(jù)驅(qū)動(dòng)試圖的實(shí)現(xiàn)方法及原理

    當(dāng)Vue實(shí)例中的數(shù)據(jù)(data)發(fā)生變化時(shí),與之相關(guān)聯(lián)的視圖(template)會(huì)自動(dòng)更新,反映出最新的數(shù)據(jù)狀態(tài), Vue的數(shù)據(jù)驅(qū)動(dòng)視圖是通過(guò)其響應(yīng)式系統(tǒng)實(shí)現(xiàn)的,以下是Vue數(shù)據(jù)驅(qū)動(dòng)視圖實(shí)現(xiàn)的核心原理,需要的朋友可以參考下
    2024-10-10
  • Vue項(xiàng)目之學(xué)生管理系統(tǒng)實(shí)例詳解

    Vue項(xiàng)目之學(xué)生管理系統(tǒng)實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹了Vue項(xiàng)目之學(xué)生管理系統(tǒng)實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • Vue axios 中提交表單數(shù)據(jù)(含上傳文件)

    Vue axios 中提交表單數(shù)據(jù)(含上傳文件)

    本篇文章主要介紹了Vue axios 中提交表單數(shù)據(jù)(含上傳文件),具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-07-07
  • vue虛擬DOM和render()函數(shù)詳解

    vue虛擬DOM和render()函數(shù)詳解

    這篇文章主要講述了Vue.js中虛擬DOM和render()函數(shù)的使用方法,虛擬DOM是Vue.js的核心概念,它通過(guò)JavaScript對(duì)象來(lái)表示DOM樹(shù),從而提高性能,render()函數(shù)比模板更接近編譯器,適用于需要JavaScript編程能力的場(chǎng)景,通過(guò)比較更新前后虛擬DOM結(jié)構(gòu)中的差異
    2024-12-12
  • vue調(diào)用微信JSDK 掃一掃,相冊(cè)等需要注意的事項(xiàng)

    vue調(diào)用微信JSDK 掃一掃,相冊(cè)等需要注意的事項(xiàng)

    這篇文章主要介紹了vue調(diào)用微信JSDK 掃一掃,相冊(cè)等需要注意的事項(xiàng),幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下
    2021-01-01
  • vue中router-view組件的使用詳解

    vue中router-view組件的使用詳解

    這篇文章主要介紹了vue中router-view組件的使用,這個(gè)時(shí)候我們就需要用到路由中的 router-view組件(也叫路由占位符)了,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • Vue使用mixin分發(fā)組件的可復(fù)用功能

    Vue使用mixin分發(fā)組件的可復(fù)用功能

    這篇文章主要介紹了Vue使用mixin分發(fā)組件的可復(fù)用功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • vuex中store.commit和store.dispatch的區(qū)別及使用方法

    vuex中store.commit和store.dispatch的區(qū)別及使用方法

    這篇文章主要介紹了vuex中store.commit和store.dispatch的區(qū)別及使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Vue3配置vite.config.js解決跨域問(wèn)題的方法

    Vue3配置vite.config.js解決跨域問(wèn)題的方法

    跨域一般出現(xiàn)在開(kāi)發(fā)階段,由于線上環(huán)境前端代碼被打包成了靜態(tài)資源,因而不會(huì)出現(xiàn)跨域問(wèn)題,這篇文章主要給大家介紹了關(guān)于Vue3配置vite.config.js解決跨域問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2024-07-07

最新評(píng)論

泰宁县| 富锦市| 崇义县| 准格尔旗| 瑞昌市| 淮安市| 巴中市| 大连市| 舒城县| 龙州县| 织金县| 米脂县| 伊金霍洛旗| 临江市| 永吉县| 林口县| 金华市| 勃利县| 江西省| 玉环县| 武鸣县| 永顺县| 宜阳县| 肥西县| 乌兰察布市| 汉川市| 扬中市| 迁安市| 西盟| 桑植县| 五莲县| 鄂托克前旗| 涞源县| 离岛区| 宁阳县| 青田县| 民和| 文昌市| 合肥市| 银川市| 平乐县|