v-show 要切换显示内容,初始化开销大html
v-if 根据状态只显示某个内容,状态切换几率小,切换开销大vue
使用key管理可复用的元素(好比切换登陆方式,不一样方式登陆内容是同样的),速度快编程
<tab v-model="index"> // 根据index切换显示不一样内容 </tab> <div> // 根据index显示不一样的数据(组件内部根据外面的提供的状态获取数据) <div class="item"> // 这里将v-show改成v-if切换tab并无执行拉取数据 <div v-show="index === 0"> <user-trip-item @setHasContent="setHasContent" :name="'unpaid'"> </user-trip-item> </div> <div v-show="index === 1"> <user-trip-item @setHasContent="setHasContent" :name="'planned'"> </user-trip-item> </div> <div v-show="index === 2"> <user-trip-item @setHasContent="setHasContent" :name="'not_reviewed'"> </user-trip-item> </div> <div v-show="index === 3"> <user-trip-item @setHasContent="setHasContent" :name="'completed'"> </user-trip-item> </div> </div> </div> // 子组件 // 根据不一样的状态获取按钮的文字并执行不一样的方法,这里能够用到表驱动法分发事件 <div > <div class="trip__list" v-for="(item, index) in items"> <img @click="toOrderDetail(item.orderNumber)" class="cover" :src="item.coverPicture"> <span class="flag">{{item.stateLabel}}</span> <div class="info"> <h3 @click="toPorductDetail(item.productId)" class="title">{{item.productTitle}}</h3> <p class="date">{{item.startTime}}</p> <div class="info__bt"> <span class="price">{{item.currency}}{{item.orderAmount}}</span> <span @click="dispatchEvent(item.state, item)" class="status" v-if="statusText[item.state] !== ''">{{statusText[item.state]}}</span> </div> </div> </div> </div>
http://note.youdao.com/notesh... 《代码大全2》表驱动法缓存
http://note.youdao.com/notesh... 登陆模块
通常某个内容重复使用3次以上就要考虑写成可复用组件了,可复用组件须要定义一个清晰的公开接口ide
数据获取 能够经过父组件props或者某种状态标示子组件内部去拉数据动画
改变外部内容event($on、$emit) 能够经过向外暴露方法内部$emit()触发执行ui
插槽slot预留空间给外部显示额外的自定义内容this
keep-alive主要用于保留组件状态或避免从新渲染,include、exclude属性容许组件有条件的缓存spa
疑问:如何设置路由部分组件缓存?3d
<keep-alive> // 路由切换的时候会从新渲染拉取数据,好比当地人中心设置语言成功后回到编辑页,从新拉取数据而没有保存语言选择的内容 <router-view></router-view> </keep-alive> // 改成便可 <keep-alive> <router-view></router-view> </keep-alive>
// 在渲染该组件的对应路由被 confirm 前调用 // 不!能!获取组件实例 `this` // 由于当钩子执行前,组件实例还没被建立 beforeRouteEnter (to, from, next) { next(vm => { vm.languages = to.query.languages vm.defaultLang = to.query.defaultLang vm.setLanguageList() }) }
beforeRouteLeave (to, from, next) { // 导航离开该组件的对应路由时调用 // 能够访问组件实例 `this` // 设置next(isSave),false来禁止用户在还未保存修改前忽然离开,true则不由止,能够设置一个变量来监听用户是否填写了信息从而是否禁用导航 }
// 编程式导航 带参数的路由(能够经过路由传递和更改数据) // 传递参数给子路由 <div @click="toPath('/profile/modifyLanguage')"></div> toPath (path) { this.$router.push({ path: path, query: { languages: this.languages, defaultLang: this.oData.systemLanguages } }) } beforeRouteEnter (to, from, next) { next(vm => { if (from.path === '/profile/modifyLanguage') { vm.languages = to.query.languages // 获取子路由传过来的数据 } if (from.path === '/') { if (vm.userRole === 1) { vm.getProfile('user') } else { vm.getProfile('guide') } } }) } // 子路由传递数据给父路由 methods: { saveLanguage () { this.$router.push({ path: '/profile', query: { // 传递数据给父路由(把语言传过去) languages: this.getSaveData() } }) } } beforeRouteEnter (to, from, next) { next(vm => { // 获取父路由传递过来的数据 vm.languages = to.query.languages vm.defaultLang = to.query.defaultLang vm.setLanguageList() }) }
http://cn.vuejs.org/v2/guide/... 过渡效果transition的设置
http://cn.vuejs.org/v2/guide/... 过渡状态 各类复杂的效果