You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从父组件清空子组件的v-model绑定值?

问题描述

点击父组件的cleanDataForm按钮或sendData按钮时,需将子组件中v-model绑定的text值置为空字符串,尝试过props、computed、Vuex均未生效。

现有代码

父组件

<template>
    <div class="Main">
        <div class="comment">
            <Smiles />
            <div class="btns">
                <button id="btn--send" type="submit" @click="sendData">Send data</button>
                <button id="btn--clear" @click="cleanDataForm">clean data</button>
            </div>
        </div>
    </div>
</template>

子组件

<template>
    <div class="container">
        <textarea
            v-model="text"
            ref="smilesTextarea"
            placeholder="Введите комментарий"
        ></textarea>
        <button @click="showSimiles">😀</button>
    </div>
</template>

解决方案

方法一:父组件通过Ref调用子组件方法(推荐)

这种方式逻辑直接,适合简单的父子组件交互。

子组件修改

新增清空文本的方法,维护自身的text数据:

<template>
    <div class="container">
        <textarea
            v-model="text"
            ref="smilesTextarea"
            placeholder="Введите комментарий"
        ></textarea>
        <button @click="showSimiles">😀</button>
    </div>
</template>

<script>
export default {
    data() {
        return {
            text: ''
        }
    },
    methods: {
        // 新增清空方法
        clearText() {
            this.text = ''
        },
        showSimiles() {
            // 保留原方法逻辑
        }
    }
}
</script>

父组件修改

给子组件添加ref,在按钮点击事件中调用子组件的清空方法:

<template>
    <div class="Main">
        <div class="comment">
            <!-- 添加ref属性 -->
            <Smiles ref="smilesComp" />
            <div class="btns">
                <button id="btn--send" type="submit" @click="sendData">Send data</button>
                <button id="btn--clear" @click="cleanDataForm">clean data</button>
            </div>
        </div>
    </div>
</template>

<script>
import Smiles from './Smiles.vue' // 确保正确引入子组件

export default {
    components: { Smiles },
    methods: {
        sendData() {
            // 保留原发送逻辑
            this.$refs.smilesComp.clearText()
        },
        cleanDataForm() {
            this.$refs.smilesComp.clearText()
        }
    }
}
</script>

方法二:通过Props+双向绑定实现

适合需要将子组件数据同步到父组件的场景,分Vue2和Vue3两种写法:

Vue 2.x 版本

子组件修改

通过props接收父组件数据,用$emit触发数据更新:

<template>
    <div class="container">
        <textarea
            :value="text"
            @input="$emit('update:text', $event.target.value)"
            ref="smilesTextarea"
            placeholder="Введите комментарий"
        ></textarea>
        <button @click="showSimiles">😀</button>
    </div>
</template>

<script>
export default {
    props: {
        text: {
            type: String,
            default: ''
        }
    },
    methods: {
        showSimiles() {
            // 保留原方法逻辑
        }
    }
}
</script>
父组件修改

使用.sync修饰符绑定数据,点击按钮时直接清空:

<template>
    <div class="Main">
        <div class="comment">
            <Smiles :text.sync="commentText" />
            <div class="btns">
                <button id="btn--send" type="submit" @click="sendData">Send data</button>
                <button id="btn--clear" @click="cleanDataForm">clean data</button>
            </div>
        </div>
    </div>
</template>

<script>
import Smiles from './Smiles.vue'

export default {
    components: { Smiles },
    data() {
        return {
            commentText: ''
        }
    },
    methods: {
        sendData() {
            // 保留原发送逻辑
            this.commentText = ''
        },
        cleanDataForm() {
            this.commentText = ''
        }
    }
}
</script>

Vue 3.x 版本

子组件修改

使用自定义v-model实现双向绑定:

<template>
    <div class="container">
        <textarea
            v-model="localText"
            ref="smilesTextarea"
            placeholder="Введите комментарий"
        ></textarea>
        <button @click="showSimiles">😀</button>
    </div>
</template>

<script setup>
import { computed } from 'vue'

const props = defineProps({
    modelValue: {
        type: String,
        default: ''
    }
})
const emit = defineEmits(['update:modelValue'])

// 计算属性实现双向绑定
const localText = computed({
    get() {
        return props.modelValue
    },
    set(val) {
        emit('update:modelValue', val)
    }
})

function showSimiles() {
    // 保留原方法逻辑
}
</script>
父组件修改

直接用v-model绑定数据,点击按钮清空:

<template>
    <div class="Main">
        <div class="comment">
            <Smiles v-model="commentText" />
            <div class="btns">
                <button id="btn--send" type="submit" @click="sendData">Send data</button>
                <button id="btn--clear" @click="cleanDataForm">clean data</button>
            </div>
        </div>
    </div>
</template>

<script setup>
import Smiles from './Smiles.vue'
import { ref } from 'vue'

const commentText = ref('')

function sendData() {
    // 保留原发送逻辑
    commentText.value = ''
}

function cleanDataForm() {
    commentText.value = ''
}
</script>

内容的提问来源于stack exchange,提问作者VueFrontend

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 04:00:02