鍍金池/ 問答/HTML/ vue如何在子組件內使用v-model綁定父組件的值?

vue如何在子組件內使用v-model綁定父組件的值?

父組件

<base-data-select 
    :select-value.sync="selectGameCategory" 
    :base-data-list="gameCategoryList" 
    @change="queryGameApi">
</base-data-select>

子組件

<template>
  <el-select v-model="selectValue" @change="queryGameApi">
    <el-option
      v-for="item in baseDataList"
      :key="item.value"
      :label="lang=='zh' ? item.nameCn : item.nameEn"
      :value="item.value">
    </el-option>
  </el-select>
</template>

<script>
  export default {
    name: 'options',
    props: ['selectValue', 'baseDataList'],
    methods: {
      queryGameApi() {
        this.$emit('update:selectValue', this.selectValue)
        this.$emit('change')
      }
    },
    computed: {
      lang() {
        return this.$store.getters.lang
      }
    }
  }
</script>

這樣寫,程序執(zhí)行正常但是,控制臺會報錯:

 vue.esm.js?efeb:574 [Vue warn]: Avoid mutating a prop directly 
 since the value will be overwritten whenever the parent 
 component re-renders. Instead, use a data or computed 
 property based on the prop's value. Prop being mutated: 
 "selectValue"
 
 

應該怎么寫才能正常啊

我剛剛又改了一下子組件,一切正常了,但是我不知道這種寫法是不是最優(yōu)雅的

<template>
  <el-select :value="selectValue" v-model="value" 
  @change="queryGameApi">
    <el-option
      v-for="item in baseDataList"
      :key="item.value"
      :label="lang=='zh' ? item.nameCn : item.nameEn"
      :value="item.value">
    </el-option>
  </el-select>
</template>

<script>
  export default {
    name: 'options',
    props: ['selectValue', 'baseDataList'],
    data() {
      return {
        value: this.selectValue
      }
    },
    methods: {
      queryGameApi() {
        this.$emit('update:selectValue', this.value)
        this.$emit('change')
      }
    },
    computed: {
      lang() {
        return this.$store.getters.lang
      }
    }
  }
</script>
回答
編輯回答
絯孑氣

子組件的 props 已經說明 selectValue 是一個 prop,但是實際上父組件并沒有給子組件傳這個值

2018年8月23日 12:06
編輯回答
懷中人
<template>
  <el-select v-model="selectValueOrg" @change="queryGameApi">
    <el-option
      v-for="item in baseDataList"
      :key="item.value"
      :label="lang=='zh' ? item.nameCn : item.nameEn"
      :value="item.value">
    </el-option>
  </el-select>
</template>

<script>
  export default {
    name: 'options',
    data(){
        return {selectValueOrg:this.selectValue}
    },
    props: ['selectValue', 'baseDataList'],
    methods: {
      queryGameApi() {
        this.$emit('update:selectValue', this.selectValueOrg)
        this.$emit('change')
      }
    },
    computed: {
      lang() {
        return this.$store.getters.lang
      }
    }
  }
</script>

這么寫應該就不會報錯了

2018年2月21日 22:16