Я пишу компонент Vue.js. Компонент отображает элемент <input>
. Слушатель событий прослушивает либо change
либо input
события, в соответствии со значением проп.
Как написать функцию рендеринга с JSX?
{
props: {
lazy: Boolean,
},
render(h) {
const bindEvent = this.lazy? 'change' : 'input'
return h('input', {
attrs: {
type: 'text',
},
on: {
[bindEvent]: e => this.$emit('update', e.target.value)
},
})
},
}
Я хочу написать что-то вроде этого:
render(h) {
const bindEvent = this.lazy? 'change' : 'input'
return <input
type='text'
on={{ [bindEvent]: e => this.$emit('update', e.target.value) }}
/>
}
render() {
const eventHandler = name =>
(this.bindEvent === name)? e => this.$emit('update', e.target.value)
: () => {}
return <input
type='text'
onChange={eventHandler('change')}
onInput={eventHandler('input')}
/>
}
render() {
const eventHandler = name =>
(this.bindEvent === name)? e => this.$emit('update', e.target.value)
: () => {}
const vNode= <input type='text' />
vNode.data.on = { [this.bindEvent]: e => this.$emit('update', e.target.value) }
return vNode
}
Ты почти там. Просто немного подправить, вот так.
<input
type="text"
v-on="{ [bindEvent]: e => this.$emit('update', e.target.value) }"
/>
Смотрите рабочую реализацию.
"directives": [{ name: "on", value: { [this.bindEvent]: e => { this.bindValue(e.target.value); } } }]
. И консоль:[Vue warn]: Failed to resolve directive: on