[vue3]组件间v-bind,v-model传参(defineProps,defineEmits)

/ 6,018评论 / 26828阅读 / 2点赞

1. 自定义组件间也可以和普通标签(<div> <span>)一样指定属性传参

2. 形如(<child value="hello coolight"></child>)给组件<child>指定value属性为"hello coolight"

3. 我们也可以自己模拟v-model的效果

下面我们来聊聊怎么传参、接收与更新

传参,v-bind

<script setup>
import { toRefs } from 'vue';
const props = defineProps({
    text:{
        type:String,
        default:"默认:hello coolight",
        required:false
    }
})

const {
    text,
} = toRefs(props);
</script>

<template>
    <span>{{props.text}} - {{text}}</span>
</template>
<script setup>
import helloVue from '../../components/global/hello.vue';
</script>

<template>
    <div>
        <hello-vue />
        <hello-vue text="洛天依"/>
        <hello-vue :text="'v-bind:洛天依'" />
    </div>
</template>

v-model

一般的传参进来,组件对它是只读的,不能修改。

只读也并不完全,对于数组和对象是可以操作其内部值的。

但我们可以使用v-model指定参数,使之允许组件来修改它。

”只读“的探讨

<script setup>
import { reactive } from 'vue';
import { toRefs } from 'vue';
const props = defineProps({
    obj:{
        type:Object
    }
})

const {
    obj,
} = toRefs(props);

const btn1_click = () => {
    props.obj.hello = "coolight - 1";
}
const btn2_click = () => {
    props.obj = reactive({
        hello:"coolight - 2"
    })
}
</script>

<template>
    <div>
        <button @click="btn1_click">1: {{obj.hello}}</button>
        <button @click="btn2_click">2: {{obj.hello}}</button>
    </div>
</template>
<script setup>
import { reactive } from 'vue';
import helloVue from '../../../components/global/hello.vue';

let obj = reactive({
    hello:"洛天依"
})
</script>

<template>
    <div>
        <span>span: {{obj.hello}}</span>
        <hello-vue :obj="obj" />
    </div>
</template>

使用v-model

<script setup>
import { toRefs } from 'vue';
const props = defineProps({
    obj:{
        type:Object
    }
})
const emits =  defineEmits ({
    'update:obj':null  //null位置可以是一个检查函数,用以检查绑定这个信号的处理函数是否有接收参数等,这里就不需要了
});

const {
    obj,
} = toRefs(props);

const btn1_click = () => {
    props.obj.hello = "btn1";
}
const btn2_click = () => {
    emits('update:obj', {
        hello:"btn2"
    });
}
</script>

<template>
    <div>
        <button @click="btn1_click">{{obj.hello}} - 修改为 btn1</button>
        <button @click="btn2_click">{{obj.hello}} - 修改为 btn2</button>
    </div>
</template>
<script setup>
import { reactive } from 'vue';
import helloVue from '../../../components/global/hello.vue';

let mValue = reactive({
    obj:{
        hello:"洛天依"
    },
})
</script>

<template>
    <div>
        <span>span: {{mValue.obj.hello}}</span>
        <hello-vue v-model:obj="mValue.obj"/>
    </div>
</template>

尝试取代v-model

<script setup>
import { reactive } from 'vue';
import helloVue from '../../../components/global/hello.vue';

let mValue = reactive({
    obj:{
        hello:"洛天依"
    },
})
const change = (in_obj) => {
    console.log("我们的change");
    mValue.obj = in_obj;
}
</script>

<template>
    <div>
        <span>span: {{mValue.obj.hello}}</span>
        <!-- 也可以这样:
            <hello-vue v-model:obj="mValue.obj" @update:obj="change"/>
        -->
        <hello-vue :obj="mValue.obj" @update:obj="change"/>
    </div>
</template>
  1. Jared Riser说道:

    Merci pour ce bel article 🙂 !

  2. TommyJew说道:

    rybelsus price: Urgent Specialists – Regenerative Medicine

  3. Yong Wasp说道:

    Merci pour ce bel article 🙂 !

  4. profi teh remont说道:

    Сервисный центр предлагает ремонт холодильников schaub lorenz на дому сервис ремонта холодильников schaub lorenz

  5. Antione Laude说道:

    Merci pour ce bel article 🙂 !

  6. Фильм485406说道:

    https://t.me/s/kino_film_serial_online_telegram 693272 лучших фильмов. Фильмы смотреть онлайн. В нашем онлайн-кинотеатре есть новинки кино и бесплатные фильмы самых разных жанров

  7. profi teh remont说道:

    Сервисный центр предлагает отремонтировать моноблока hp качественый ремонт моноблоков hp

  8. BradleypaiLd说道:

    размещение рекламы в яндексе seo продвижение сайта заказать

  9. WilliamTub说道:

    Care provides: gabapentin pro – involves multisystem

  10. Spot on with this write-up, I truly believe this site needs much more attention. I’ll probably be back again to read more, thanks for the information!

  11. Сервисный центр предлагает ремонт телефонов jinga в москве срочный ремонт телефонов jinga

  12. RobertObefe说道:

    See risks: See risks – paxlovid store

  13. Kia Minshall说道:

    Merci pour ce bel article 🙂 !

  14. TommyJew说道:

    good price: stromectol – find bets price

  15. RobertObefe说道:

    amoxil price: amoxil price – amoxil 1st shop

  16. profi teh remont说道:

    Сервисный центр предлагает качественный ремонт видеокарт xfx отремонтировать видеокарты xfx

  17. TommyJew说道:

    stromectol store: stromectol – cheapest

  18. Julene Kuman说道:

    Merci pour ce bel article 🙂 !

  19. This is a topic that’s near to my heart… Many thanks! Exactly where are your contact details though?

  20. Russellwar说道:

    http://semaglutide.ink/# Regenerative Medicine

  21. profi teh remont说道:

    Сервисный центр предлагает ремонт электросамоката e-scooter рядом центр ремонта электросамоката e-scooter

  22. profi teh remont说道:

    Сервисный центр предлагает качественый ремонт стиральных машин de dietrich ремонт стиральной машины de dietrich

  23. RamonZib说道:

    https://paxlovid1st.store/# cheapest paxlovid

  24. TommyJew说道:

    semaglutide online: Patient Portal – semaglutide

  25. RamonZib说道:

    https://gabapentin1st.pro/# same-day delivery

  26. RobertObefe说道:

    top-rated pills: top-rated pills – shop

  27. WilliamJog说道:

    Decouvrez notre selection de
    Couteaux de table
    au meilleur prix

  28. Сервисный центр предлагает ремонт фотоаппарата olympus на дому ремонт фотоаппаратов olympus адреса

  29. profi teh remont说道:

    Сервисный центр предлагает ремонт электросамоката zilmer на дому стоимость ремонта электросамоката zilmer

  30. HarryMaigh说道:

    pin-up casino giris pin up pin up

  31. I needed to thank you for this very good read!! I definitely loved every little bit of it. I have you saved as a favorite to look at new stuff you post…

  32. profi-teh-remont说道:

    Сервисный центр предлагает замена usb разъема lenovo thinkpad t520 замена стекла lenovo thinkpad t520

  33. JosephThoub说道:

    Нарколог выезд в Астане https://narcologicheskiy-centr-v-astane.kz/

  34. Manup Gummies说道:

    Adored the information in this post. It’s very well-researched and filled with helpful insights. Great effort!

  35. DerekZeple说道:

    http://biznes-fabrika.kz/# пинап казино
    pinup bet and casino

  36. MichaelKeype说道:

    http://sweetbonanzatr.pro/# sweet bonanza oyna

  37. Insupure说道:

    What an wonderful post! The information provided is extremely helpful and articulate. Many thanks for taking the time to compose this.

  38. JasonLot说道:

    pin up kz: Пин Ап Казино Официальный Сайт – Пин Ап Казахстан

  39. Yasmin Slobodnik说道:

    Pretty! This has been an extremely wonderful article. Thanks for providing these details.

  40. MichaelKeype说道:

    https://pinupzerkalo.fun/# бонусы пин ап

  41. profi-teh-remont说道:

    Сервисный центр предлагает замена разъема питания moto e6 plus замена переднего стекла moto e6 plus

  42. JasonLot说道:

    sweet bonanza tr: sweet bonanza – sweet bonanza oyna

  43. profi-teh-remont说道:

    Сервисный центр предлагает ремонт samsung galaxy grand prime ve g531 ремонт samsung galaxy grand prime ve g531 цены

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注