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

/ 6,021评论 / 26835阅读 / 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. profi-teh-remont说道:

    Сервисный центр предлагает ремонт umidigi bison 2 pro ремонт umidigi bison 2 pro цены

  2. DerekZeple说道:

    http://pinup-az.bid/# pin up
    pinup bet and casino

  3. HarryMaigh说道:

    sweet bonanza oyna sweetbonanzatr.pro sweet bonanza

  4. HarryMaigh说道:

    pinup az pin up 306 pin up azerbaycan

  5. JasonLot说道:

    pin up casino: pinup – pin up casino

  6. MichaelKeype说道:

    https://biznes-fabrika.kz/# пин ап 634

  7. JasonLot说道:

    sweetbonanzatrpro: sweet bonanza – sweet bonanza tr

  8. MichaelKeype说道:

    https://sweetbonanzatr.pro/# sweetbonanzatr.pro

  9. tubidy mp3说道:

    Can I simply say what a comfort to discover a person that genuinely knows what they’re discussing on the net. You actually understand how to bring an issue to light and make it important. More and more people should read this and understand this side of your story. I was surprised you aren’t more popular given that you surely have the gift.

  10. DerekZeple说道:

    https://pinupzerkalo.fun/# Официальный Сайт
    pin up win

  11. JasonLot说道:

    pinup: pin-up – pin up casino

  12. JefferyTriep说道:

    pin up kz: пины – пинап

  13. HarryMaigh说道:

    пин ап казино pinco пинап казино

  14. JasonLot说道:

    sweetbonanzatrpro: sweet bonanza – sweetbonanzatr.pro

  15. HarryMaigh说道:

    pinup-az bid pin up azerbaycan pinup

  16. DerekZeple说道:

    https://sweetbonanzatr.pro/# sweet bonanza oyna
    pin up win

  17. MichaelKeype说道:

    https://pinup-az.bid/# pin up 306

  18. JasonLot说道:

    pin up casino: pin-up – pin up azerbaycan

  19. JefferyTriep说道:

    бонусы пин ап: пин ап зеркало – бонусы пин ап

  20. PLANTSULIN说道:

    This post is incredibly informative. I truly valued going through it. The content is highly structured and simple to understand.

  21. JasonLot说道:

    пинап казино: pin up zerkalo – пинко

  22. JefferyTriep说道:

    sweetbonanzatrpro: sweet bonanza nas?l oynan?r – sweet bonanza

  23. You have made some good points there. I checked on the internet for more info about the issue and found most people will go along with your views on this website.

  24. HarryMaigh说道:

    Пин Ап Казино Официальный Сайт в России Официальный Сайт Пин Ап Казино Официальный Сайт в России

  25. DerekZeple说道:

    https://biznes-fabrika.kz/# Пин Ап Казахстан
    pin up win

  26. JefferyTriep说道:

    sweet bonanza: sweet bonanza – sweetbonanzatrpro

  27. HarryMaigh说道:

    pin up azerbaycan pin up azerbaycan pin up

  28. Turmeric Hack说道:

    This article is amazing! Full of valuable information and very articulate. Thank you for offering this.

  29. livejasmin说道:

    Can I simply say what a relief to uncover someone that actually knows what they are discussing on the net. You actually know how to bring an issue to light and make it important. More people have to look at this and understand this side of the story. I was surprised that you aren’t more popular given that you surely have the gift.

  30. JasonLot说道:

    пины: пин ап казино – пин ап 634

  31. JefferyTriep说道:

    pinup az: pin-up casino giris – pinup az

  32. JasonLot说道:

    пин ап кз: pin up kz – pin up kz

  33. check here说道:

    It’s hard to find knowledgeable people about this topic, however, you sound like you know what you’re talking about! Thanks

  34. JasonLot说道:

    pin up 306: pin up 306 – pinup az

  35. HarryMaigh说道:

    пин ап кз пины пин ап 634

  36. Профессиональный сервисный центр по ремонту Apple iPhone в Москве.
    Мы предлагаем: сервисный центр iphone в москве
    Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!

  37. HarryMaigh说道:

    пин ап казино пинап казино пин ап казино

  38. MichaelAnigo说道:


    Временная регистрация в Москве: Быстро и Легально!
    Ищете, где оформить временную регистрацию в Москве? Мы гарантируем быстрое и легальное оформление без очередей и лишних документов. Ваше спокойствие – наша забота!
    Минимум усилий • Максимум удобства • Полная легальность
    Свяжитесь с нами прямо сейчас!
    .

  39. This is great. I learned a lot from going through it. The information is highly informative and structured.

  40. JasonLot说道:

    пинко: пинап казино – Официальный Сайт

  41. This article is fantastic! Filled with useful details and very articulate. Many thanks for providing this.

  42. «Дизайн человека» — сложная система самопробуждения, которая позволяет найти внутренний авторитет и опереться на него «Дизайн человека»

  43. MichaelKeype说道:

    https://biznes-fabrika.kz/# пин ап казино онлайн

发表回复

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