如何通过自定义指令修改 v-model 属性的值? [英] How to modify the value of v-model property via custom directive?
本文介绍了如何通过自定义指令修改 v-model 属性的值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
当我使用自定义指令改变组件的值时,没有效果:
Vue.directive('maxchars', {绑定(el,绑定,vnode){让 maxChars = binding.value;让处理程序 = 函数(e){如果(e.target.value.length > maxChars){e.target.value = e.target.value.substr(0, maxChars)}}el.addEventListener('input', handler);}});让应用程序 = 新 Vue({el: '#app',数据() {返回 {内容: '',总数:140}}})
<script src="https://unpkg.com/vue@2.5.16/dist/vue.js"><;/脚本><div id='应用程序'><div><div class='content'><textarea v-model='content' v-maxchars='140'>告诉我一些事情</textarea>
当我使用 v-bind:input
指令改变值时是可以的!
解决方案
第一:
- 您正在使用
v-model
,textarea
的值将是v-model
变量中的任何值(在在这种情况下,变量content
).这意味着 DOM 的初始值被忽略. - 为了处理这个问题,我将字符串从 DOM 声明移动(见下文)到
data()
中的content
.
第二:
- Vue 不直接响应
.value
中的更改.v-model
实际上监视来自 DOM 元素的input
✱ 事件.- ✱ 实际上是根据元素的类型而变化的,有时是
change
事件,或者其他
- ✱ 实际上是根据元素的类型而变化的,有时是
- 如果您只是设置了
value
,Vue 将在下次更新时简单地将其覆盖(覆盖content
中的任何内容).
解决方案:
更改.value
后,触发input
事件. Vue 将拾取该事件并更新v-model
变量从当前 .value
覆盖它之前.
演示:
Vue.directive('maxchars', {绑定(el,绑定,vnode){让 maxChars = binding.value;让处理程序 = 函数(e){如果(e.target.value.length > maxChars){e.target.value = e.target.value.substr(0, maxChars);vnode.elm.dispatchEvent(new CustomEvent('input'));//添加了这个}}el.addEventListener('input', handler);}});让应用程序 = 新 Vue({el: '#app',数据() {返回 {内容:告诉我一些事情",总数:140}}})
<script src="https://unpkg.com/vue@2.5.16/dist/vue.js"><;/脚本><div id='应用程序'><div><div class='content'><textarea v-model='content' v-maxchars='18'></textarea>
<预>内容:{{内容}}最大字符数为 18,当前为 {{ content.length }}.