vue-文本字段绑定值不反映实际值

时间:2019-10-22 06:53:36

标签: vue.js vuejs2 vue-component v-model

我有一个简单的组件,它带有一个值道具,并显示一个用于编辑它的文本字段。如果数字小于零,我希望它只是,如果文本从文本字段中删除,我希望它为零 。在我的emit事件中,我看到我正在发出正确的值,只是它没有反映在文本字段本身中。

我有a fiddle link here,但是下面列出了主要部分:

<div id="app">
  <test-component v-model="foo"></test-component>
</div>
const TestComponent = {
    props: ['value'],
    template: `<div>{{value}}
    <input type="number" :value="value" @input="update($event.target.value)" />
  </div>`,
  methods: {
    update(value) {
      this.$emit("input", value <= 0 ? 0 : value)
    }
  }
}
new Vue({
  el: "#app",
  components: {
    'test-component': TestComponent
  },
  data: {
    foo: 1
  },

})

基本上发生了什么,我可以看到事件以0值发出,但是,您可以看到{{value}}反映了道具中的内容,但然而 textfield本身中的打印值是空的(或小于零)

在这里肯定有一些基本的误解,我认为:value应该反映现实,但显然不是。非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您需要在key上放一个TestComponent,然后每次foo更新时更改密钥,这将触发重新渲染,这是这里的问题。

答案 1 :(得分:0)

根据@Michael的回复,诀窍是使用key来触发重新渲染。

there's a new fiddle here,它不是特别优雅,我只是想先让它开始:)

此处更新了元素:

<div id="app">
  <test-component :key="key" :value="foo" @input="input"></test-component>
</div>

const TestComponent = {
    props: ['value'],
    template: `<div>
    <input type="number" :value="value" @input="update($event.target.value)" />
  </div>`,
  methods: {
    update(value) {
      this.$emit("input", value <= 0 ? 0 : value)
    }
  }
}
new Vue({
  el: "#app",
  components: {
    'test-component': TestComponent
  },
  data: {
    key: 0,
    foo: 1
  },
  methods: {
    input (value) {
      this.foo = value;
      this.key += 1;
    }
  }

})