vue.js - 如何修复此错误 : "v-model cannot be used on a prop, because local prop bindings are not writable?"

标签 vue.js frontend vue-component vuejs3

我正在尝试进行下拉排序,但收到此错误:

VueCompilerError: v-model cannot be used on a prop, because local prop bindings are not writable. Use a v-bind binding combined with a v-on listener that emits update:x event instead.

error photo

这里有 2 个组件 AppMySelect:

<template>
  <!--  App Component -->
  <div class="app">
    <h1>Страница с постами</h1>
    <div class="app__btns">
      <my-button @click="showDialog">Cоздать пост</my-button>
      <my-select v-model="selectedSort" :options="sortOptions" />
    </div>
    <my-dialog v-model:show="dialogVisible">
      <post-form @create="createPost" />
    </my-dialog>
    <post-list :posts="posts" @remove="removePost" v-if="!isPostsLoading" />
    <div v-else>Идет загрузка...</div>
  </div>
</template>

<script>
import axios from 'axios'
import PostForm from './components/PostForm.vue'
import PostList from './components/PostList.vue'
export default {
  components: { PostList, PostForm },
  data() {
    return {
      posts: [],
      dialogVisible: false,
      isPostsLoading: false,
      selectedSort: '',
      sortOptions: [
        { value: 'title', name: 'По названию' },
        { value: 'body', name: 'По содержанию' },
      ],
    }
  },
  methods: {
    createPost(post) {
      this.posts.push(post)
      this.dialogVisible = false
    },
    removePost(post) {
      this.posts = this.posts.filter((p) => p.id !== post.id)
    },
    showDialog() {
      this.dialogVisible = true
    },
    async fetchPosts() {
      try {
        this.isPostsLoading = true
        const res = await axios.get(
          'https://jsonplaceholder.typicode.com/posts?_limit=10'
        )
        this.posts = res.data
      } catch (error) {
        alert('ошибка')
      } finally {
        this.isPostsLoading = false
      }
    },
  },

  mounted() {
    this.fetchPosts()
  },
}
</script>

<!-- флаг scoped - значит, что стили будут применяться только к этому комопненту -->
<style>
.app {
  padding: 20px;
}

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

.app__btns {
  margin: 15px 0;
  display: flex;
  justify-content: space-between;
}
</style>
<template>
  <!-- MySelect component -->
  <select v-model="modelValue" @change="changeOption">
    <option disabled value="">Выберите из списка</option>
    <option v-for="option in options" :key="option.value" :value="option.value">
      {{ option.name }}
    </option>
  </select>
</template>

<script>
export default {
  name: 'my-select',
  props: {
    modelValue: {
      type: String,
    },
    options: {
      type: Array,
      default: () => [],
    },
  },

  methods: {
    changeOption(event) {
      this.$emit('update:modelValue', event.target.value)
    },
  },
}
</script>

<style lang="scss" scoped></style>

我需要更新modelValue,所以我尝试添加

:value="modelValue" 

而不是

v-model="modelValue"

它有效,但我不确定这是否是正确的解决方案。

最佳答案

如果其他人在更新 vue 版本时遇到此问题。请注意,此错误从版本 3.2.45 开始出现。

对于实现模式,如文档中所述, Prop 应在组件内被视为只读。 Vue 在 3.2.45 版本之前没有充分执行它。

包含良好实现模式链接的文档:https://vuejs.org/guide/components/props.html#one-way-data-flow

关于vue.js - 如何修复此错误 : "v-model cannot be used on a prop, because local prop bindings are not writable?",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75378580/

相关文章:

javascript - 在条件变量中渲染 css 类

vue.js - 从 Vuex Store 访问模块

vue.js - 如何在 vue CLI 项目中安装 vuex?

vue.js - 在 vuetify 中打开对话框时将数据分配给字段

javascript - 在 IE7 中,require 回调函数中未定义模块

javascript - 如何禁用按钮组(Bootstrap)中的按钮?

javascript - 找不到此依赖项: components/main/Footer in ./node_modules..../src/App.vue

javascript - 无法将准确的错误消息从nodejs发送到浏览器

javascript - 页面不加载路由器模式 : history on Apache

javascript - 仅当部分不是视口(viewport)时,如何使图像贴在底部?