vue 更改data值的时候,不知为何会其他元素会重新渲染

<script type="text/x-template" id="modeProgram">

    <div>

        <div class="calendar">

            <ul class="day header">
                <li class="dayList" v-for="(m, index) in 7" v-bind:key="m.index" v-text="getWeekdayText(m)"></li>
            </ul>
            <div class="day content">
                <router-link tag="div" to="" class="dayList" v-bind:class=" m == 12 ? 'g' : null || m == 28 ? 'r' : null " v-for="(m, index) in 42" v-bind:key="index">

                    <transition name="opacity" mode="out-in">
                        <div class="text" v-if=" generateCalendar({method:'query',index:m}) ">
                            <p v-for="l in 3">21391232103809f9dsiljlaksdjlkkl</p>
                        </div>
                    </transition>
                    <transition name="opacity" mode="out-in">
                        <div class="num" v-text=" generateCalendar({method:'get',index:m}) "></div>
                    </transition>

                </router-link>
            </div>

        </div>

        <div class="snyc">

            <div class="title" v-on:click="miao = !miao">
                <span>同步与记录</span>
                <span class="icon-more" v-bind:class="{av:miao}">
                    <span></span>
                    <span></span>
                </span>
            </div>

            <transition name="opacity" mode="out-in">
                <div v-if="miao">

                    <div class="herader">
                        <div class="tap">设备</div>
                        <div class="tap">历史记录</div>
                    </div>
                    <ul class="list">

                        <li class="content">

                            <div class="select">
                                <input />
                            </div>
                            <div class="images">图片</div>
                            <div class="name">名字</div>
                            <div class="downloading">下载</div>
                            <div class="fn">操作</div>

                        </li>

                        <li class="content">

                            <div class="select">
                                <input />
                            </div>
                            <div class="images">

                            </div>
                            <div class="name"></div>
                            <div class="downloading"></div>
                            <div class="fn">
                                <button>删除</button>
                            </div>

                        </li>

                        <li class="content">

                            <div class="select"></div>
                            <div class="images"></div>
                            <div class="name"></div>
                            <div class="downloading"></div>
                            <div class="fn">
                                <button>添加</button>
                            </div>

                        </li>

                    </ul>

                </div>
            </transition>

        </div>

    </div>

</script>
<script>

    Vue.component('mode-program', {

        template:'#modeProgram',
        data (){
            return{
                Date:{
                    year:null,
                    month:null
                },
                miao:true
            }
        },
        computed:{
            details () {
                return store.state.details.data
            },
            nowYear(){
                return this.Date.year
            },
            nowMonth(){
                return this.Date.month+1
            }
        },
        watch:{
            'Date.year':function () {
                window.dayNum = 0
            },
            'Date.month':function () {
                window.dayNum = 0
            }
        },
        created (){
            window.dayNum = 0
            this.setDate();
        },
        mounted (){
        },
        methods:{
            setDate(){

                let time = new Date()
                this.Date.year = time.getFullYear()
                this.Date.month = time.getMonth()

            },
            lastMonth:function () {

                if ( this.Date.month <= 0 ){
                    this.Date.month = 11;
                    this.lastYear();
                }else {
                    --this.Date.month;
                }

            },
            nextMonth:function () {

                if ( this.Date.month >= 11 ){
                    this.Date.month = 0;
                    this.nextYear();
                }else {
                    ++this.Date.month;
                }

            },
            lastYear:function () {
                this.Date.year <= 1970 ? this.Date.year = 1970 : --this.Date.year
            },
            nextYear:function () {
                ++this.Date.year
            },
            getWeekdayText:function(m) {

                let text
                if (m == 1){ text = '一' }
                if (m == 2){ text = '二' }
                if (m == 3){ text = '三' }
                if (m == 4){ text = '四' }
                if (m == 5){ text = '五' }
                if (m == 6){ text = '六' }
                if (m == 7){ text = '日' }

                return text

            },
            generateCalendar:function(s) {

                let method = s.method

                let time = new Date().setFullYear(this.Date.year != null ? this.Date.year : '',this.Date.month != null ? this.Date.month : '',1)

                let day = new Date( time ).getDate()

                let month = this.Date.month != null ? new Date( time ).getMonth() : new Date().getMonth()

                let year = this.Date.year != null ? new Date( time ).getFullYear() : new Date().getFullYear()

                let weekDay = this.Date.year != null ? new Date( time ).getDay() : new Date().getDay()

                weekDay == 0 ? weekDay = 7 : weekDay

                let index = s.index ? s.index : 0
                let isLeapYear = year % 4 == 0 ? [31,29,31,30,31,30,31,31,30,31,30,31] : [31,28,31,30,31,30,31,31,30,31,30,31]
                let e = {
                    1:[3,5,1,10,17,21],
                    2:[7,11,16],
                    3:[9,22,30]
                }


                if ( s.index >= weekDay && window.dayNum < isLeapYear[month] ){

                    if ( method === 'query' ){
                        return true
                    }
                    if ( method === 'get' ){
                        window.dayNum = ++window.dayNum
                        return window.dayNum
                    }



                }

            }
        }

    })

</script>

当我更改里面的miao的时候,calendar里面的getWeekdayText()和generateCalendar()会被重新调用,为什么会这样?


经实验,v-if和v-show都有影响


https://jsfiddle.net/d4ffo06k/1/

在开关下面同步与记录的时候下面日期的东西就会消失

阅读 3.3k
3 个回答
新手上路,请多包涵

个人意见:这里使用的是v-if,v-if会根据miao的值来重新渲染加载,是所有该div下的数据和视图重新渲染,所以会再次调用方法,如果不想这样,可以使用v-show来试试。

经过几个小时的整理,终于找到了问题所在,虽然为什么更改那个状态会触发那个函数还未琢磨透,不过暂时这个方法是可行的,链接地址:https://jsfiddle.net/luozz/d4...

注意那个generateCalendar函数的后几行便可,其它的你可以参考,就稍微优化了一下,没有具体去修改其它代码,只是为了找到问题所在而进行的各种尝试。

问题出现在了window.dayNum未在函数执行完成之后进行置0,导致下一次触发函数保存的数值是上一次执行函数的最终值

希望我的回答能帮助你找到问题所在! ^_^

谢邀,这很正常,你这是“一个”组件,这个组件依赖 miao ,所以 miao 变了整个组件必然跑一遍更新周期。不希望被调用就需要提示 vue 这里不需要更新,

  • template 用 computed 转换好的数据;
  • 或者划分子组件;
  • 或者用 v-once
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题