在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ vue的計(jì)算屬性和偵聽屬性,方法

vue的計(jì)算屬性和偵聽屬性,方法

我自己寫todolist的時(shí)候,做已完成和未完成篩選的時(shí)候,發(fā)現(xiàn)用計(jì)算屬性只能執(zhí)行一次,再就動(dòng)不了了。
下面的代碼是把filterlists放到方法里面,就可以用了,但是放到計(jì)算里面就只執(zhí)行一次。
計(jì)算屬性不是依賴有更新,自己就會(huì)更新嗎。

<template>
    <div class="demo">
        <h1>vue-todolist</h1>
        <p id="newlist">
            <input v-model="newtodo" v-on:keyup.enter="addlist" type="text">
            <time>{{uptime}}</time>
        </p>
        <ul class="mylist">
            <h3 style="margin:0">mylist-todo</h3>
            <li v-for="item in filterlists()">
                <input type="checkbox"  v-model="item.ischeck">
                <span v-bind:class="{completed:item.ischeck}">{{item.text}}</span>
                <span @click="dellist(item)" class="del">&times;</span>
                <span class="addtime">{{item.addtime}}</span>
            </li>
        </ul>
        <div class="control">
            <button @click="mycom">已完成</button>
            <button @click="mynot">未完成</button>
            <button @click="myall">全部</button>
        </div>
    </div>
</template>

<script>
    export default {
        data(){
            return{
                newtodo:'',
                lists:[],
                compoleted:false,
                notyet:false
            }
        },
        props:{
            uptime:{
                type:String
            }
        },
        methods:{
            addlist(){
                if(this.newtodo){
                    this.lists.push({
                        text:this.newtodo.trim(),
                        ischeck:false,
                        addtime:this.uptime
                    });
                    this.newtodo='';
                }
            },
            dellist(thisdata){
                this.lists.splice(this.lists.indexOf(thisdata),1);
            },
            myall(){
                this.completed=false;
                this.notyet=false;
            },
            mycom(){
                this.completed=true;
                this.notyet=false;
            },
            mynot(){
                this.completed=false;
                this.notyet=true;
            },
            filterlists:function(){
                if(this.completed){
                    return this.lists.filter(function(todo){
                        return todo.ischeck
                    })
                }else if(this.notyet){
                    return this.lists.filter(function(todo){
                        return !todo.ischeck
                    })
                }else{
                    return this.lists;
                }
            }
        },
        computed:{

        }
        
    }
</script>

這是頁面效果

clipboard.png

回答
編輯回答
撿肥皂

建議你把completed 維護(hù)為一個(gè)狀態(tài),計(jì)算屬性里根據(jù)這一個(gè)狀態(tài)進(jìn)行過濾就好了。
如:status = [all: 全部, open: 未完成, closed: 已完成];

   filterlists:function(){
       if(this.status === 'all') {
           return this.lists;
       } else {
           return this.lists.filter(value => this.status === 'closed' ? value.ischeck : !value.ischeck)
       }
   }
2017年5月20日 23:20
編輯回答
柒喵

給你復(fù)制一段文檔中的話吧

我們可以將同一函數(shù)定義為一個(gè)方法而不是一個(gè)計(jì)算屬性。兩種方式的最終結(jié)果確實(shí)是完全相同的。然而,不同的是計(jì)算屬性是基于它們的依賴進(jìn)行緩存的。計(jì)算屬性只有在它的相關(guān)依賴發(fā)生改變時(shí)才會(huì)重新求值。這就意味著只要 message 還沒有發(fā)生改變,多次訪問 reversedMessage 計(jì)算屬性會(huì)立即返回之前的計(jì)算結(jié)果,而不必再次執(zhí)行函數(shù)。
2017年12月13日 15:39
編輯回答
別硬撐

計(jì)算屬性是基于它們的依賴進(jìn)行緩存的。計(jì)算屬性只有在它的相關(guān)依賴發(fā)生改變時(shí)才會(huì)重新求值。你的filelist寫成計(jì)算屬性太復(fù)雜了,沒有明顯地依賴哪個(gè)data,可能因此監(jiān)測不到

2017年8月4日 00:50