组件传值

  • vue3组件通信方式为以下几种

  • props

  • $emit

  • $expose / ref
    父组件获取子组件的属性或者调用子组件方法

  • $attrs
    attrs:包含父作用域除class和style除外的非props属性集合

  • v-model
    可以支持多个数据双向绑定

  • provide / inject
    provide/inject为依赖注入 provide:可以让我们指定想要提供给后代组件的数据 inject:在任何后代组件中接受想要添加在这个组件上的数据,不管组件嵌套多深都可以直接拿来用

  • Vuex

  • mitt

  • props

<child :msg2="msg2" />

<script setup>

    const props = defineProps({

        // 写法一

        msg2:String

        // 写法二

        msg2:{

            type:String,

            default:''

        }

    })

    console.log(props) // {msg2:'这是传级子组件的信息2'}

</script>
  • $emit

//Child.vue

<template>

    // 写法一

    <div @click="emit('myclick')">按钮</div>

    // 写法二

    <div @click="handleClick">按钮</div>

</template>

<script setup>

    // 方法一

    const emit = defineEmits(['myClick'],['myClick2'])

    // 方法二

    const handleClick = () => {

        emit('myClick','这是发送给父组件的信息');

     }

      

     // 方法二 不适用于vue3.2,使用的useContext()已经舍弃

     import { useContext } from 'vue'

     const { emit } = useContext()

     const handleClick = () => { 

      emit('myClick','这是发送给父组件的信息'   

     }

</script>

 


// Parent.vue响应

<template>

    <child @myClick="onMyClick"></child>

</template>

<script setup>

    import child from "./child.vue"

    import onMychilk = (msg) => {

        console.log(msg) // 父组件收到的信息 

    }

</script>

expose / ref

<script setup>

    // 方法一:useContext() vue3.2 之后已经舍弃

    import { useContext } from 'vue'

    const ctx = useContext()

    // 对外暴露属性方法等都可以

    ctx.expose({

        childName: '这是子组建的属性',

        someMethod(){

        console.log('这是子组件的方法')

        }

    })

</script>

 

// Parent.vue 注意 ref="comp"

<template>

    <child ref="comp"></child>

    <button @click="handleClick">按钮</button>

</template>

<script>

    import child from './child.vue'

    import { ref } from 'vue' 

    const comp = ref(null)

    const handleClick = () => {

        console.log(comp.value.childName)

        comp.value.someMethod() // 调用子组件对外暴露的方法

    }

</script>

attts

// 父组件

<child :msg1="msg1" :msg2="msg2" title="3333"></child>

<script setup>

    import child from './child.vue'

    import { ref,reactive } from 'vue

    const msg1 = ref('111')

    const msg2 = ref('222')

</script>

 

// 子组件

<script setup>

    import { defineProps,useContext,useAttars } from 'vue'

    const props = defineProps({

        msg1: String

    })

     

    // 方法1

    const ctx = useContext()

    console.log(ctx.attars) // {msg2:'222',title:'333'}

     

    // 方法2 

    const attrs = useAttars()

    console.log(attars)  // {msg2:'2222',title:'3333'}

</script>

v-model

<child v-model:key="key" v-modle:value="value" />

<script>

    import child from './child.vue'

    import { ref,reactive } from 'vue'

    const key = ref('111')

    const value = ref('222')

</script>

 

//子组件

<template>

   <button @click="handleClick"></button>

</template>

<script setup>

    // 方法一  v3.2 已被移除

    import { useContext } from 'vue'

    const { emit } = useContext()

     

    // 方法二

    import { defineEmits } from 'vue'

    const emit = defineEmits(['key','value'])

     

    //用法

    const handleClick = () => {

        emit('update:key','新的key')

        emit('update:value','新的value')

    }

</script>

provide / inject

// 父组件

<script setup>

    import { provide } from 'vue'

    const name = provide('name')

    console.log('name','沐华')

</script>

//子组件

<script setup>

    import { inject } from 'vue'

    const name = inject('name')

    console.log(name) //木华

</script>

Vuex

//store/index.js

import { createStore } from 'vuex'

export default createStore({

    state:{count:1},

    getters:{

        getCount:state=>state.count

    },

    mutations:{

        add(state){

            state.count++

        }

    }

   })

 // main.js

 import { createApp } from 'vue'

 import APP from './App.vue'

 import store from './store'

 createApp(APP).use(store).mount("#app")

  

 // 直接使用

 <template>

     <div>

         {{ $store.state.count }}

     </div>

     <button @click="$store.commit('add')">

     </button>

 </template>

  

 // 获取

 <script setup>

     import { useStore,computed } from 'vuex'

     const store = useStore()

     console.log(store.state.count)

      

     const count = computed (()=>store.state.count)

     console.log(count)

 </script>

原文地址:http://www.cnblogs.com/maxiaohu/p/16807081.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性