vuejs v-model值没有在父级中更新



使用Vue3

父组件

<template>
<div class="col-12 col-lg-12">
<input-image v-model="imageFile"/>                                                            
</div>
</template>
<script>
import InputImage from "@/Pages/components/InputImage";
export default{
components : {
InputImage,
},

data() {
return {
imageFile : null,
}
}
}
</script>

InputImage(子(组件

<template>
<div class="form-group">
<div
class="base-image-input"
:style="{ 'background-image': `url(${imageData})` }"
@click="chooseImage"
>
<span v-if="!imageData" class="placeholder">Featured Image </span>
<input
class="file-input"
ref="fileInput"
type="file"
@input="onSelectFile"
/>
</div>
</div>
</template>
<script>
export default {
data() {
return {
imageData: null,
};
},
methods: {
chooseImage() {
this.$refs.fileInput.click();
},
onSelectFile() {
const input = this.$refs.fileInput;
const files = input.files;
if (files && files[0]) {
const reader = new FileReader();
reader.onload = (e) => {
this.imageData = e.target.result;
};
reader.readAsDataURL(files[0]);
this.$emit("input", files[0]);
}
},
},
};
</script>

选择文件v-model(imageFile(后,父组件中的值不会更改,原因是什么?甚至我还在onSelectFile((方法中向父组件发出输入事件。我在这里以编程方式设置文件名。子组件中的值发生了变化,但文件名没有反映在父组件中,我希望通过父组件中的v模型来反映。

Vue 3更改了v-model更新的事件没什么大不了的,但您将模型道具定义为modelValue而不是model,将事件定义为update:modelValue而不是输入。

因此,在您的情况下,只需从更新子组件的方法

this.$emit("input", files[0]);

this.$emit("update:modelValue", files[0]);

你应该坚强!https://v3-migration.vuejs.org/breaking-changes/v-model.html

最新更新