【问题标题】:v-model implementation via render function is not reactive通过渲染函数实现 v-model 不是反应式的
【发布时间】:2017-07-29 08:04:15
【问题描述】:

我正在尝试创建可在 input 和 textarea 标签之间互换的动态输入组件。我正在尝试通过使用渲染功能来实现这一点。 (https://vuejs.org/v2/guide/render-function.html#v-model)。

我遇到的问题是 v-model 只能以一种方式工作,如果我直接更改 data 属性,它会更新 textarea 值,但如果我更改或输入新数据到 textarea 它不会更新 data 属性。有谁知道如何让它双向工作? 这是我的代码笔代码链接,它说明了问题:

const tag = Vue.component('dynamic-tag', {
    name: 'dynamic-tag',
    render(createElement) {
        return createElement(
            this.tag,
            {
                domProps: {
                    value: this.value
                },
                on: {
                    input: event => {
                        this.value = event.target.value
                    }
                }
            },
            this.$slots.default
        )
    },
    props: {
        tag: {
            type: String,
            required: true
        }
    }
})

const app = new Vue({
  el: '#app',
  data: {
    message: ''
  },
  components: {tag}
})

http://codepen.io/asolopovas/pen/OpWVxa?editors=1011

【问题讨论】:

    标签: javascript vue.js vuejs2 vue-component


    【解决方案1】:

    您需要 $emit 更改您的输入。

    on: {
        input: event => {
            this.value = event.target.value
            this.$emit('input', event.target.value)
        }
    }
    

    【讨论】:

    • @AndriusSolopovas 我同意,文档似乎掩盖了这一点。
    • 在您的情况下,this 上下文在哪里?我刚刚用 TS 试了一下,除了类型错误之外,它根本不起作用。无法读取 null 的属性“值”
    • @AlexanderKim 这取决于您如何定义渲染函数。如果您按照问题所示这样做,它将是 Vue 组件。如果您的渲染函数是箭头函数,那么它可能不起作用。
    【解决方案2】:

    问题是您正在使用带有自定义组件的 v-model。 当与组件一起使用时,v-model="message" 只是语法糖

    v-bind:value="message"
    v-on:input="value => { message = value }"
    

    因此,要将 v-model 与自定义组件一起使用,您的组件必须具有 value 属性并使用更改后的值发出输入事件。

    我会留下更多的解释给documentation

    【讨论】:

    • 我知道如何通过从具有值的自定义组件发出输入来实现自定义组件的 v-model,问题是它向我的 vue-devtools 发送大量垃圾邮件,我认为我可以实现它悄悄地以务实的方式。所以它有点像原生 v-model,老实说,如果渲染函数实现 v-for 和其余属性,应该有一种实现完整 v-model 的方法。
    猜你喜欢
    • 2021-06-12
    • 2021-04-28
    • 1970-01-01
    • 2019-09-21
    • 2022-12-11
    • 2019-04-07
    • 1970-01-01
    • 2018-06-15
    • 2011-09-07
    相关资源
    最近更新 更多