javascript - implementacija v-model putem render funkcije nije reaktivna


Pokušavam stvoriti dinamičku ulaznu komponentu koja će se moći zamijeniti između tagova input i textarea. Pokušavam to implementirati koristeći render funkciju. (https://v2.vuejs.org/v2/guide/render-function.html#v-model).

Problem koji imam je taj što v-model radi samo u jednom smjeru, ako promijenim podatkovnu svojstvo izravno, vrijednost tekstualnog područja se ažurira, ali ako promijenim ili unesem nove podatke u tekstualno područje, podatkovno svojstvo se ne ažurira. Zna li netko kako ga učiniti da radi u oba smjera? Ovdje je moj link koda za CodePen ispod koji ilustrira problem:

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

Odgovor #1

Trebaš $emit promjene iz svog unosa.

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

Odgovor #2

Problem je u tome što koristite v-model s prilagođenom komponentom. Kada se koristi s komponentom v-model="message" je samo sintaktički šećer za

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

Dakle, za korištenje v-model s prilagođenom komponentom, vaša komponenta mora imati value prop i emitirati input događaj s promijenjenom vrijednošću.

Daljnja objašnjenja ću prepustiti dokumentaciji