vue v-model 在props 中的使用 子控件与父控件(一)

本文探讨了Vue中父组件与子组件的数据同步问题,通过实例展示了如何使用v-model和props进行数据绑定,但发现子组件输入框无法实时更新父组件状态。文章留待下期解析解决方案。

 学习博客之前我们先看要实现的效果图

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/4.2.0/normalize.css">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.js"></script>
    <title>v-model-with-props</title>
    <style>
        #app {
            margin: 1em;
            font-size: 1.5em;
        }
    </style>
</head>
<body>
<div id="app">
    <p>Paent:{{message}}<input type="text" v-model="message"></p>
    <hr>
    <p>
        Child:
        <my-component :parent-message="message"></my-component>
    </p>

</div>
<script>
    Vue.component('my-component',{
        template:'  <span>{{parentMessage}}<input type="text" v-model="message"></span>',
        props:{
            parentMessage:String
        },
        data(){
            return{
                message:this.parentMessage
            }
        }

    });
    new Vue({
        el:'#app',
        data:{
            message:'hello',
        }
    });
</script>
</body>
</html>

当父组件输入框发生变化的时候,

子输入框并不会跟随变化,

如果我们想要他发生变化如何操作呢 且听下回分解

### Vue 中 `v-model` 实现组件父组件通信 在 Vue 中,`v-model` 提供了种简洁的方式来处理输入控件上的双向数据绑定。当应用于自定义组件时,它实际上是个语法糖,用于简化 props 和事件的组合。 #### 组件间的数据流动机制 对于自定义组件而言,`v-model` 默认会利用名为 `value` 的 prop 来接收来自父级的数据,并通过触发名为 `input` 的事件来向上传递更新后的值给父级[^1]。这种模式有效地实现了父组件间的双向数据流控制。 #### 组件设计要点 为了使 `v-model` 正常工作于组件上,需确保: - 定义了个名为 `value` 的 prop 接收外部传入的状态; - 当内部状态发生变化时,发出带有新值作为参数的 `update:value` 或者传统意义上的 `input` 事件通知父组件进行同步操作[^2]。 以下是具体实现方式及其代码示例: ```vue <!-- ParentComponent.vue --> <template> <div class="parent"> <!-- 使用 v-model 进行双向绑定 --> <ChildComponent v-model="message"></ChildComponent> <p>Message from child component: {{ message }}</p> </div> </template> <script setup lang="ts"> import { ref } from 'vue'; import ChildComponent from './ChildComponent.vue'; const message = ref('Hello, world!'); </script> ``` ```vue <!-- ChildComponent.vue --> <template> <div class="child"> <textarea :value="modelValue" @input="$emit('update:modelValue', $event.target.value)"> Enter your text here... </textarea> <button type="button" @click="clearText">Clear Text</button> </div> </template> <script setup lang="ts"> defineProps<{ modelValue?: string; }>(); // 清除文本框内容并发送新的值回父组件 function clearText() { emit('update:modelValue', ''); } const emit = defineEmits(['update:modelValue']); </script> ``` 在这个例中,每当用户修改 `<textarea>` 内的内容或点击清除按钮时,都会调用相应的逻辑并通过 `$emit()` 方法告知父组件最新的字符串值,从而保持双方的致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安果移不动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值