鍍金池/ 問答/HTML/ 關(guān)于vue中methods發(fā)生點(diǎn)擊事件改變data中數(shù)據(jù)的問題

關(guān)于vue中methods發(fā)生點(diǎn)擊事件改變data中數(shù)據(jù)的問題

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script type="text/javascript" src="js/vue.js"></script>
</head>
<body>
    <div class="navDiv">
        <ul>
            <li v-for="(fir_nav, fir_index) in fir_level_nav">
                <h3 v-on:click="show_sec_nav(fir_index)">{{ fir_nav }}</h3>
                <ul>
                    <li v-for="(sec_nav, sec_index) in sec_level_nav[fir_index]" v-show="sec_navShow[fir_index]">
                        <h4 v-on:click="show_thr_nav(fir_index*3+sec_index)">{{sec_nav}}</h4>
                        <ul>
                            <li v-for="(thr_nav, thr_index) in thr_level_nav[fir_index*3+sec_index]" v-show="thr_navShow[fir_index*3+sec_index]">
                                <h5>{{thr_nav}}</h5>
                            </li>
                        </ul>
                    </li>
                </ul>
            </li>
        </ul>
        <p v-show="secHide">{{sec_navShow}}</p>
        <p v-show="thrHide">{{thr_navShow}}</p>
        <input type="text" v-model="sec_navShow[1]">
    </div>
<script type="text/javascript">
    var navData = [{
        一級(jí)菜單1: [{
            二級(jí)菜單1_1: ['三級(jí)菜單1_1_1', '三級(jí)菜單1_1_2', '三級(jí)菜單1_1_3', '三級(jí)菜單1_1_4']
        },{
            二級(jí)菜單1_2: ['三級(jí)菜單1_2_1', '三級(jí)菜單1_2_2', '三級(jí)菜單1_2_3']
        },{
            二級(jí)菜單1_3: ['三級(jí)菜單1_3_1', '三級(jí)菜單1_3_2']
        },]
    }, {
        一級(jí)菜單2: [{
            二級(jí)菜單2_1: ['三級(jí)菜單2_1_1', '三級(jí)菜單2_1_2']
        },{
            二級(jí)菜單2_2: ['三級(jí)菜單2_2_1', '三級(jí)菜單2_2_2']
        },{
            二級(jí)菜單2_3: ['三級(jí)菜單2_3_1', '三級(jí)菜單2_3_2', '三級(jí)菜單2_3_3']
        },]
    }, {
        一級(jí)菜單3: [{
            二級(jí)菜單3_1: ['三級(jí)菜單3_1_1', '三級(jí)菜單3_1_2', '三級(jí)菜單3_1_3', '三級(jí)菜單3_1_4']
        },{
            二級(jí)菜單3_2: ['三級(jí)菜單3_2_1', '三級(jí)菜單3_2_2']
        },{
            二級(jí)菜單3_3: ['三級(jí)菜單3_3_1', '三級(jí)菜單3_3_2', '三級(jí)菜單3_3_3']
        },]
    }, {
        一級(jí)菜單4: [{
            二級(jí)菜單4_1: ['三級(jí)菜單4_1_1', '三級(jí)菜單4_1_2', '三級(jí)菜單4_1_3']
        },{
            二級(jí)菜單4_2: ['三級(jí)菜單4_2_1', '三級(jí)菜單4_2_2', '三級(jí)菜單4_2_3', '三級(jí)菜單4_2_4']
        },{
            二級(jí)菜單4_3: ['三級(jí)菜單4_3_1', '三級(jí)菜單4_3_2']
        },]
    }];

    function getNavList(arr) {
        var nav = []
        for (var s = 0; s < arr.length; s++) {
            for (var key in arr[s]) {
                if (arr[s].hasOwnProperty(key)) {
                    nav.push(key)
                }
            }
        }
        return nav
    }

    var navDiv = new Vue({
        el: '.navDiv',
        data: {
            navDataDemo: navData,
            sec_navList: [],
            thr_navList: [],
            sec_nav_show: [],
            thr_nav_show: [],
            secHide: true,
            thrHide: true
        },
        methods: {
            show_sec_nav: function (index) {
                for (var i = 0; i < this.sec_navShow.length; i++) {
                    this.sec_navShow[i] = false
                }
                this.sec_navShow[index] = !this.sec_navShow[index]
                this.secHide = !this.secHide
            },
            show_thr_nav: function (index) {
                for (var i = 0; i < this.thr_navShow.length; i++) {
                    this.thr_navShow[i] = false
                }
                this.thr_navShow[index] = !this.thr_navShow[index]
                this.thrHide = !this.thrHide
            }
        },
        computed: {
            fir_level_nav: function () {
                var nav = []
                for (var i = 0; i < this.navDataDemo.length; i++) {
                    for (var key in this.navDataDemo[i]) {
                        if (this.navDataDemo[i].hasOwnProperty(key)) {
                            nav.push(key)
                        }
                    }
                    
                }
                return nav
            },
            sec_level_nav: function () {
                for (var i = 0; i < this.navDataDemo.length; i++) {
                    var navName = getNavList(this.navDataDemo[i][this.fir_level_nav[i]])
                    this.sec_navList.push(navName)
                }
                return this.sec_navList
            },
            thr_level_nav: function () {
                for (var i = 0; i < this.navDataDemo.length; i++) {
                    for (var s = 0; s < this.navDataDemo[i][this.fir_level_nav[i]].length; s++) {
                        for (var key in this.navDataDemo[i][this.fir_level_nav[i]][s]) {
                            if (this.navDataDemo[i][this.fir_level_nav[i]][s].hasOwnProperty(key)) {
                                this.thr_navList.push(this.navDataDemo[i][this.fir_level_nav[i]][s][key])
                            }
                        }
                        
                    }
                }
                return this.thr_navList
            },
            sec_navShow: function () {
                for (var i = 0; i < this.sec_level_nav.length; i++) {
                    this.sec_nav_show.push(false)
                }
                return this.sec_nav_show
            },
            thr_navShow: function () {
                for (var i = 0; i < this.thr_level_nav.length; i++) {
                    this.thr_nav_show.push(false)
                }
                return this.thr_nav_show
            }
        }
    })
</script>
</body>
</html>

以上為全部代碼,代碼要實(shí)現(xiàn)的是動(dòng)態(tài)加載數(shù)據(jù)中的各級(jí)菜單,一級(jí)菜單顯示,二三級(jí)菜單點(diǎn)擊顯示?,F(xiàn)在的情況是,data中最后兩個(gè)變量secHide和thrHide是后來(lái)加上的。因?yàn)闆]有這兩個(gè)變量及對(duì)這兩個(gè)變量的操作,想要的點(diǎn)擊菜單顯示下級(jí)菜單的效果就不能顯示出來(lái)。
現(xiàn)在比較懵的就是為什么不加這兩個(gè)變量和對(duì)它們的操作頁(yè)面會(huì)沒有效果。求大神解答一下。

回答
編輯回答
空白格

收藏了 找到答案麻煩@一下 謝謝

2017年3月2日 01:29
編輯回答
玄鳥

這段代碼問題好多,最好先看看文檔computed是怎么工作的。

現(xiàn)在比較懵的就是為什么不加這兩個(gè)變量和對(duì)它們的操作頁(yè)面會(huì)沒有效果

首先是因?yàn)椴患幽莾蓚€(gè),就不會(huì)認(rèn)為數(shù)據(jù)有更改,因此數(shù)據(jù)雖然改動(dòng)了,但不會(huì)重新渲染。
題主computed定義sec_navShow,這里定義的sec_navShow會(huì)在sec_nav_show更改時(shí)被觸發(fā),而題主卻在methods.show_sec_nav中對(duì)sec_navShow進(jìn)行賦值,這種行為不在computed的監(jiān)控下。其他部分代碼也有類似問題。

可以改成下面這樣

show_sec_nav: function(index) {
    this.sec_navShow = Array.from({ length: this.sec_navShow.length }).fill(false);
    this.sec_navShow[index] = true;
},

然后把sec_navShowcomputed移到data

2017年3月21日 22:03