我有两个部分:父母和子元素.父对象的数组为cars,子对象的数组为cars.我的问题是,我的子组件将cars变成一个对象,而不是将一个对象推入carsarray.我的父组件:

<template>
   <child v-model="cars"></child>
    <ul>
      <li v-for="car in cars">
         {{ car.model }}
      </li>
    </ul>
</template>

export default {
 data: function() {
  return {
    cars: []
  }
 }
}

我的子元素部分:

<template>
    <div>
        <button type="button" @click="addCar()">Add Car</button>
    </div>
</template>

export default {
    methods: {
        addCar() {
            this.$emit("input", { model: "some car model" })
        }
    }
}

预期结果:

cars得到更新,变成[{ model: "some car model"}, { model: "some car model"}, etc...]

实际结果:

cars变成一个对象{model: "some car model"}

这是我的小提琴:

https://jsfiddle.net/t121ufk5/529/

我假设我在我的子组件上使用v-model的方式有问题和/或我emits 的方式不正确.有人能帮忙吗?提前谢谢!

推荐答案

让我们来讨论一下,为什么你得不到合适的结果.然后我们讨论了解决这个问题的其他方法.

首先,我们需要了解默认情况下v-model如何在自定义组件上工作.

当使用文本input(包括emailnumber等类型)或textarea时,v-model="varName"相当于:value="varName" @input="e => varName = e.target.value".这意味着在输入varName的每次更新被更新为输入的值之后,输入的值被设置为varName.一个普通的 Select 元素也会这样做,尽管多重 Select 是不同的.

现在我们需要理解,

How Does v-model Work On Components?

由于Vue不知道您的组件应该如何工作,或者如果它试图充当某种类型输入的替代品,那么它对v-model个组件都一视同仁.它实际上与文本输入的工作方式完全相同,只是在事件处理程序中,它不希望事件对象传递给它,而是希望值直接传递给它.所以…

<my-custom-component v-model="myProperty" />

…和…是一样的…

<my-custom-component :value="myProperty" @input="val => myProperty = val" />

所以当你运用这种方法时.你必须得到value作为props .确保你的名字是input.

现在你可以问我,你做错了什么?

好的,看看代码@input="val => myProperty = val"

当你输入一个新值时.这newValue将更新您想要更新的父值.

这是你的密码this.$emit("input", { model: "some car model" }).

使用对象更新父值.所以你的Array更新为Object.

让我们来解决全部问题.

父组件:

<template>
   <child v-model="cars"></child>
    <ul>
      <li v-for="car in cars">
         {{ car.model }}
      </li>
    </ul>
</template>

export default {
 data: function() {
  return {
    cars: []
  }
 }
}

`

子组件:

<template>
    <div>
        <button type="button" @click="addCar()">Add Car</button>
    </div>
</template>

export default {
    props: ['value']
    methods: {
        addCar() {
            this.$emit("input", this.value.concat({model: "some car model"}))
        }
    }
}

实际上,你可以用几种方法来解决这个问题.

第二种方法,

起源:

<template>
   <child :cars="cars"></child>
    <ul>
      <li v-for="car in cars">
         {{ car.model }}
      </li>
    </ul>
</template>

export default {
 data: function() {
  return {
    cars: []
  }
 }
}

子元素:

<template>
    <div>
        <button type="button" @click="addCar">Add Car</button>
    </div>
</template>

export default {
    props: {
       cars: {
          type: Array,
          default:[]
       }
    },
    methods: {
        addCar() {
            this.cars.push({ model: "some car model" })
        }
    }
}

最后一种方法:

起源:

    <template>
        <child @update="addCar"></child>
            <ul>
                <li v-for="car in cars">
                    {{ car.model }}
                </li>
            </ul>
    </template>

    export default {
        data() {
            return {
                cars: []
            }
        }
   },
   methods: {
      addCar() {
           this.cars.push({ model: "some car model" })
      }
   }
}

子元素:

 <template>
     <div>
        <button type="button" @click="update">Add Car</button>
     </div>
    </template>

    export default {
        methods: {
            update() {
                this.$emit('update')
            }
        }
    }

Vue.js相关问答推荐

VITE:无法为VUE单文件组件加载URL

Vue.js编译的render函数不起作用

vue3 ssr 不返回纯 html

通过元素加中的正则表达式输入电话号码格式

超出最大调用堆栈大小 - Vue路由

vue js导航到带有问号的url

vuejs:将props传递给javascript中的组件?

如何使用 Vue 命名插槽呈现静态内容列表?

用 axios 搜索:新字符时取消之前的请求

Vuejs中的条件a href

Laravel 事件未广播

我可以在 Vue 实例方法中传播的 mapMutations 中使用this吗?

VueJS错误编译模板

Nuxt.js - API 调用的最佳场所

如何避免在 Vue 中一直写 this.$store.state.donkey 的需要?

按键删除对象不会更新vue组件

如何从 vue 组件调用 App.vue 中的方法

Vuejs - 使用 v-if 切换的保持活动组件

偶数行格式化

如何在 vuejs 中的基于类的组件中编写计算设置器