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

/ 6,011评论 / 26803阅读 / 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. Тут можно преобрести оружейный сейф на заказ москва купить оружейный сейф

  2. Тут можно преобрести купить в москве оружейный сейф оружейные сейфы цена

  3. Dereknef说道:

    Casino Siteleri: Canl? Casino Siteleri – Deneme Bonusu Veren Siteler

  4. Тут можно преобрести сейф оружейный доставка оружейный сейф купить москва

  5. ClydeTal说道:

    Casino Siteleri: guvenilir casino siteleri – Canl? Casino Siteleri

  6. Тут можно преобрести купить шкаф для ружья купить сейф оружейный

  7. ClydeTal说道:

    en cok kazand?ran slot oyunlar?: en kazancl? slot oyunlar? – en kazancl? slot oyunlar?

  8. Dereknef说道:

    Casino Siteleri: casino siteleri win – guvenilir casino siteleri

  9. LarryBow说道:

    matadorbet bid matadorbet.bid matadorbet

  10. CarrollWip说道:

    deneme bonusu veren siteler https://ultrabet-tr.online/# ultrabet

  11. tubidy说道:

    Next time I read a blog, I hope that it does not fail me just as much as this particular one. I mean, Yes, it was my choice to read through, however I truly thought you would have something useful to say. All I hear is a bunch of complaining about something that you could possibly fix if you weren’t too busy looking for attention.

  12. Dereknef说道:

    deneme bonusu veren siteler 2024: denemebonusuverensiteler.top – deneme bonusu veren yeni siteler

  13. CarrollWip说道:

    deneme bonusu veren siteler betturkey https://ultrabet-tr.online/# ultrabet bonus

  14. NQPOUZV说道:

    AFYDJFS GHJKCGY AOWQVCF JWYZLFH
    https://9gm.ru/article?BVLBOJ

  15. Dereknef说道:

    en kazancl? slot oyunlar?: slot oyunlar? puf noktalar? – en kazancl? slot oyunlar?

  16. LarryBow说道:

    deneme bonusu veren siteler betturkey betturkey.com deneme bonusu veren siteler mycbet.com denemebonusuverensiteler.top

  17. Тут можно преобрести сейф москва огнестойкий купить несгораемые сейфы

  18. HassanMesty说道:

    https://casinositeleri.win/# Canl? Casino Siteleri
    deneme bonusu veren siteler denemebonusu2026.com

  19. CarrollWip说道:

    deneme bonusu veren siteler betturkey https://ultrabet-tr.online/# ultrabet yeni giris 1125

  20. Boostaro Reviews说道:

    Truly liked going through this post. It’s extremely informative and structured. Great effort!

  21. ClydeTal说道:

    slot oyunlar?: en kazancl? slot oyunlar? – slot oyunlar? puf noktalar?

  22. Genuinely enjoyed this article. It offered plenty of valuable insights. Excellent work!

  23. HassanMesty说道:

    http://casinositeleri.win/# Deneme Bonusu Veren Siteler
    deneme bonusu veren siteler betturkey

  24. ClydeTal说道:

    casino siteleri win: Deneme Bonusu Veren Siteler – Casino Siteleri

  25. Appreciated this article. It’s so detailed and filled with helpful details. Thank you for sharing such beneficial details.

  26. Dereknef说道:

    slot oyunlar?: en cok kazand?ran slot oyunlar? – slot oyunlar? puf noktalar?

  27. CarrollWip说道:

    denemebonusuverensiteler.top https://denemebonusuverensiteler.top/# deneme bonusu veren siteler yeni

  28. Тут можно преобрести купить сейф огнестойкий в москве купить сейф огнестойкий в москве

  29. Nutrim说道:

    Excellent post. I found the content highly useful. Appreciated the method you explained all the points.

  30. turmeric hack说道:

    Adored the details in this post. It’s highly comprehensive and packed with helpful insights. Great effort!

  31. Тут можно преобрести шкаф оружейный сейфы для оружия

  32. LewisJow说道:

    кафельная плитка для ванной легкая укладка https://ukladka-keramogranita-spb.ru

  33. Тут можно сейф для дома москва сейф домашний цена

  34. Тут можно преобрести несгораемый сейф цена сейфы пожаростойкие

  35. Тут можно купить сейф москва для дома купить сейф в дом

  36. Тут можно сейфы для дома цены в москве домашние сейфы купить

  37. Тут можно преобрести оружейные сейфы цена шкафы для оружия сейфы

  38. DevonStolf说道:

    https://pharm24.pro/# real viagra without a doctor prescription
    fast ed meds online

  39. Williambiz说道:

    how to fix ed http://indianpharm24.pro/# india pharmacy

  40. JorgeSEk说道:

    vacuum pumps for ed: cheap meds – erectile dysfunction

  41. Careyclouh说道:

    Ищете место, где можно расслабиться после тяжёлого дня? Сауны Москвы — это идеальное место для отдыха и релаксации. Здесь вы сможете насладиться паром, поплавать в бассейне и получить массу удовольствия. Узнайте больше на нашем сайте https://dai-zharu.ru/

  42. Earnestfemia说道:

    Right here is the right webpage for everyone who wants to find out about this topic. You realize so much its almost tough to argue with you (not that I really would want to…HaHa). You definitely put a brand new spin on a subject that’s been discussed for ages. Wonderful stuff, just wonderful!

    поведенческие факторы яндекс накрутка пф

  43. Williambiz说道:

    male ed https://mexicanpharm24.cheap/# mexico drug stores pharmacies

  44. JorgeSEk说道:

    reputable mexican pharmacies online: mexico pharmacy cheap – mexico pharmacies prescription drugs

  45. Fantastic entry. I discovered the details extremely useful. Loved the manner you detailed the content.

  46. Кино688597说道:

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

发表回复

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