vue?filters和directives訪問this的問題詳解
vue filters和directives訪問this
記錄一次奇葩的需求。
要求自定義一個指令,點擊后能跳轉(zhuǎn)指定路由。
directives和filters壓根就沒法訪問this。
腦袋都想破了。
不廢話了,上代碼。
<template>
<div>
<div v-join="(divData, that)">tag標(biāo)簽</div>
<p>{{divData}}</p>
<p>{{divData | sum(that)}}</p>
</div>
</template>
<script>
export default {
name: 'Main',
data(){
return {
divData:'傳入的值',
that: this,
filtersData: '過濾器的值'
}
},
filters: {
sum(val, that){
return `${val}和${that.filtersData}`
}
},
directives: {
join: {
inserted(el, binding){
},
bind(el, binding){
console.log('------2')
el.addEventListener('click', function(){
binding.value.that.$router.push({
path: '/aside'
})
})
}
}
}
}
</script>
解決方案是在data中定義一個that變量指向this,再將這個變量當(dāng)做參數(shù)傳進(jìn)directives,在directives內(nèi)部就可以訪問到this了,filters同理。
directives所遇小bug
自己在利用vue寫todoList的時候遇到一個小bug,記錄一下
寫個指令,當(dāng)雙擊進(jìn)行編輯todo,讓其自動聚焦,結(jié)果效果如下,

代碼如下:
directives: {
focus(el,bindings) {
if(bindings.value) {
el.focus();
}
}
}<input v-focus="todo == t" type="text" v-show="todo == t" v-model="todo.title" @blur="reset" @keyup.13="reset" >
多方查找原因,把自定義v-focus指令放末尾,就好了,代碼如下:
<input type="text" v-show="todo == t" v-model="todo.title" @blur="reset" @keyup.13="reset" v-focus="todo == t">
是否自定義指令都應(yīng)放后面呢?這就需要以后驗證了
完整代碼如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link rel="stylesheet" href="../node_modules/bootstrap/dist/css/bootstrap.css">
<style>
.del{
text-decoration: line-through;
color: #ccc!important;
}
</style>
</head>
<body>
<div id="app">
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="panel panel-warning">
<div class="panel-heading">
<input type="text" v-model="value" class="form-control" @keydown.enter="add">
</div>
<div class="panel-body">
<ul class="list-group">
<li class="list-group-item" @dblclick="change(todo)" v-for="(todo,index) in todos" :key="index">
<div v-show="todo != t" :class="{del: todo.isSelected}">
<input type="checkbox" v-model="todo.isSelected">{{todo.title}}
<button class="pull-right btn btn-danger btn-xs" @click="remove(index)">⨂</button>
</div>
<input type="text" v-show="todo == t" v-model="todo.title" @blur="reset" @keyup.13="reset" v-focus="todo == t">
<!-- 下面是錯誤代碼,可以把上面的注釋掉打開下面的對比下 -->
<!-- <input v-focus="todo == t" type="text" v-show="todo == t" v-model="todo.title" @blur="reset" @keyup.13="reset" > -->
</li>
</ul>
</div>
<div class="panel-footer">
<ul class="nav nav-pills">
<li role="presentation" class="active"><a href="#">全部</a></li>
<li role="presentation"><a href="#">已完成</a></li>
<li role="presentation"><a href="#">未完成</a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="../node_modules/vue/dist/vue.js"></script>
<script>
let vm = new Vue({
el:'#app',
data:{
todos:[],
hash:'complete',//路徑切換時 獲取的hash值
value:'',// 輸入框中需要增加的內(nèi)容,
t:''//當(dāng)前點擊的那一個
},
created(){ //當(dāng)vue創(chuàng)建時執(zhí)行的方法
//如果storage有 就用這里的值 沒有就是空數(shù)組
this.todos = JSON.parse(localStorage.getItem('todos')) || [{isSelected:true,title:'晚上回去睡覺'}];
},
watch:{ //watch默認(rèn) 只監(jiān)控一層,例如 todos 可以監(jiān)控數(shù)組的變化,監(jiān)控不到對象的變化
todos:{
handler(){
localStorage.setItem('todos',JSON.stringify(this.todos));
},
deep:true
}
},
methods:{
addTodo(){
let todo = {isSelected:false,title:this.value};
this.todos.push(todo);
this.value = '';
},
remove(todo){
this.todos = this.todos.filter(item=>todo!==item);
},
change(todo){
//todo代表的是我當(dāng)前點擊的是哪一個,存儲當(dāng)前點擊的這一項
this.t = todo;
},
reset(){
this.t = '';
}
},
computed:{
lists(){
if(this.hash === 'complete'){
return this.todos;
}
if(this.hash === 'finish'){
return this.todos.filter(item=>item.isSelected)
}
if(this.hash === 'unfinish'){
return this.todos.filter(item=>!item.isSelected)
}
},
total(){
//求出數(shù)組中為false的個數(shù)
//將數(shù)組中的true全部干掉,求出剩余l(xiāng)ength
return this.todos.filter(item=>!item.isSelected).length;
}
},
directives:{ //指令,就是操作dom
focus(el,bindings){
//bindings中有一個value屬性 代表的是指令對應(yīng)的值v-auto-focus="值"
if(bindings.value){
el.focus();
}
//console.log(el,bindings);
}
}
});
let listener = () => {
let hash = window.location.hash.slice(1) || 'complete'; //如果打開頁面沒有hash默認(rèn)是全部
vm.hash = hash;
};
listener(); //頁面一加載 就需要獲取一次hash值,否則可能導(dǎo)致 回到默認(rèn)hash
window.addEventListener('hashchange',listener,false);
</script>
</body>
</html>以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- Vue3實現(xiàn)全局loading指令的示例詳解
- vue全局注冊自定義指令防抖解析
- vue全局自定義指令和局部自定義指令的使用
- Vue全局自定義指令Modal拖拽的實踐
- vue全局自定義指令-元素拖拽的實現(xiàn)代碼
- vue directive定義全局和局部指令及指令簡寫
- 對Vue2 自定義全局指令Vue.directive和指令的生命周期介紹
- vue3的自定義指令directives實現(xiàn)
- vue 自定義指令directives及其常用鉤子函數(shù)說明
- vue通過指令(directives)實現(xiàn)點擊空白處收起下拉框
- 詳解vue + vuex + directives實現(xiàn)權(quán)限按鈕的思路
- vue全局指令文件?directives詳解
相關(guān)文章
Vue3?<script?setup?lang=“ts“>?的基本使用
<script setup>?是在單文件組件 (SFC) 中使用?composition api?的編譯時語法糖,本文主要講解<script setup>?與?TypeScript?的基本使用,感興趣的朋友跟隨小編一起看看吧2022-12-12
Vue父組件調(diào)用子組件函數(shù)實現(xiàn)
這篇文章主要介紹了Vue父組件調(diào)用子組件函數(shù)實現(xiàn),全文通過舉例子及代碼的形式進(jìn)行了一個簡單的介紹,希望大家能夠理解并且學(xué)習(xí)到其中知識2021-08-08
vue2.0如何動態(tài)綁定img的src屬性(三元運(yùn)算)
這篇文章主要介紹了vue2.0如何動態(tài)綁定img的src屬性(三元運(yùn)算)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08

