<div id="app"> <input type="text" v-limit.3="msg" v-focus> </div> <script src="./node_modules/vue/dist/vue.js"></script> <script> Vue.directive("focus",{ /* 方法一*/ /* bind(el){ Vue.nextTick(function(){ // 在dom元素執行完以後執行 el.focus(); }); }*/ /* 方法二 */ inserted(el){ //綁定元素插入父節點時調用 el.focus(); } }); Vue.directive("limit",function(el,bindings,vnode){ /* el:元素 bindings:元素綁定的值 vue dom的更新是異步的 */ console.log(el); console.log(bindings); console.log(vnode); let [,len] = bindings.rawName.split("."); /*思想就是 把在文本框輸入的值手動改到虛擬dom中,在虛擬dom 中改變 vlaue的值*/ let ctx = vnode.context; el.addEventListener("input",(e)=>{ let val = e.target.value.slice(0,len) ctx[bindings.expression] = val; console.log("ctx:",ctx[bindings.expression]); el.value = val; }); // el.value = ctx[bindings.expression].slice(0,len); }); /* Vue.directive("limit",{ //初始化的時候綁定 bind(el,bindings,vnode) { let ctx = vnode.context; ctx[bindings.expression]= el.value.slice(0,5); }, //數據更新的時候綁定 update(el,bindings,vnode) { let ctx = vnode.context; ctx[bindings.expression]= el.value.slice(0,5); } }); */ let vm = new Vue({ el:"#app", data:{ msg:"hello vue" } }); </script>