vue的渲染

本文介绍了Vue.js中的条件渲染和列表渲染技巧,包括v-if、v-else、v-show及v-for指令的使用方法。对比了v-if与v-show的区别,并详细说明了v-for在数组和对象上的应用。

条件渲染

v-if、v-else

条件渲染,如果条件为真,则显示,否则不显示

div v-if="Math.random()<0.3">随机数小于0.3,所以我才会显示了呢</div>
<div v-else-if="Math.random()>=0.3 && Math.random()<0.6">0.3~0.6之间了。。到我显示了?</div>
<div v-else>随机数大于0.6哈哈,你们都不出来那我自己先出来了啊。。。</div>
注意:v-else一定是位于v-if 或者v-else-if之后,否则不会被识别。同理,v-else-if也必须位于v-if和v-else-if之后

v-show

这个命令同v-if一样,都可以用来控制元素的是否展示,不同的是使用v-show命令渲染的元素会始终DOM中,只是控制了元素的属性display。。。

v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。
v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。
相比之下,v-show 就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。
一般来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。
——-摘自Vue.js官网

列表渲染

v-for

v-for把一个数组对应为一个元素,v-for的指令格式为“item in items”,在v-for块中,我们拥有对父作用属性的完全权限访问。

<div v-for="(item,index) in items" v-if="index == 3">
            {{item.trr.a}}
        </div>
        <hr />
        <div v-for="(item,index) of items">
            <div v-if="index == 3">{{item.trr.a}}</div>
            {{item.trr}}
        </div>
data: {    
      items: [
           {trr: 'Monday'},
           {trr:'Tuesday'},
           {trr:'Wen'},
           {trr: {
               a: 'ss',
               b: 'dd',
               c: 'cc'
               }}
           ]
      },

图片效果显示
上面代码效果显示

如上述代码所示,我们也可以用of 替代in,index为当前索引

对象的v-for

 <div v-for="obj in objs">{{obj}}</div>
data: {
    objs: {
           zero: '偷偷告诉你,我是一个数组哦!!',
           one: 'haha',
           two: 'xixi',
           three: '我是谁,我来自哪里?'
         },
}

代码效果图

从上述效果图可以,v-for遍历时,默认取得是value的值。

在使用v-for遍历对象时,可以使用第二个参数作为对象的键值。

   <div v-for="(value,key) in objs">{{key}}:{{value}}</div>

代码效果图

v-for在遍历对象时,还提供了第三个参数作为索引值

<div v-for="(value,key,index) in objs">
   我的索引值是第{{index}}个-----{{key}}:{{value}}
</div>

代码效果图

v-for与key的联合应用

实际上key与v-for并不是特别有关联。理想的key值的项是有且唯一的id,使用v-bind绑定如下:
 <div v-for="item in items" :key="item.id"></div>

数组的更新检测
变异方法

push()
pop()
shift()
unshift()
splice()
sort()
reverse()

替换数组(非变异方法),会返回一个新数组

slice()
fliter()
concat()

由于 JavaScript 的限制,Vue 不能检测以下变动的数组:
当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue
当你修改数组的长度时,例如:vm.items.length = newLength
为了解决第一类问题,以下两种方式都可以实现和 vm.items[indexOfItem] = newValue 相同的效果,同时也将触发状态更新:

// Vue.set
Vue.set(example1.items, indexOfItem, newValue)
// Array.prototype.splice
example1.items.splice(indexOfItem, 1, newValue)

为了解决第二类问题,你可以使用 splice:

example1.items.splice(newLength)

对于已经创建的实例,Vue 不能动态添加根级别的响应式属性。但是,可以使用 Vue.set(object, key, value) 方法向嵌套对象添加响应式属性。例如,对于:

Vue.set(vm.objs,'four','新添加的属性') //给objs这一对象中添加一个新的响应式属性
vm.$set(vm.objs,'five','另一个新添加的属性');

代码效果图

如果想为对象赋予多个属性时,可以使用Object.assign()_.extend()方法。我们应该这样添加:

vm.objs = Object.assign({},vm.objs,{
            'aa': 20,
            'ss': 90
        })

代码效果图

显示数组的过滤和排序效果

 <div v-for="n in evenNumbers">{{ n }}</div>
data: {
       items: [
            {trr: 'Monday'},
            {trr:'Tuesday'},
            {trr:'Wen'},
            {trr: {
                    a: 'ss',
                    b: 'dd',
                    c: 'cc'
                }}
        ]
     },
            computed: {
                evenNumbers: function () {
                    return this.items.sort()
                }
            },

有时,我们想要显示一个数组的过滤或排序副本,而不实际改变或重置原始数据。在这种情况下,可以创建返回过滤或排序数组的计算属性。

而如果存在嵌套的情况下,可以创建一个方法。。

<li v-for="n in even(numbers)">{{ n }}</li>
data: {
  numbers: [ 1, 2, 3, 4, 5 ]
},
methods: {
  even: function (numbers) {
    return numbers.filter(function (number) {
      return number % 2 === 0
    })
  }
}

关于v-for的一般取值

还可以取数字,表示多次重复
<div v-for="a in 4">ahhah</div>

谈谈v-for 和 v-if
当他们处于同一节点的时候,v-for的优先级比v-if的优先级要高。

Vue.js 中,页面与组件的渲染机制是基于其核心特性——响应式数据绑定系统与虚拟 DOM 的高效更新策略。Vue 通过模板语法将数据绑定到视图,并通过组件化架构实现模块化开发,从而实现高效的页面与组件渲染。 ### 页面渲染的基本流程 Vue.js 的页面渲染流程可以分为以下几个关键步骤: 1. **模板编译**:Vue 使用模板语法定义视图结构,模板中的指令(如 `{{ }}`、`v-bind`、`v-on` 等)用于将数据与 DOM 进行绑定。Vue 在初始化时会解析模板并生成渲染函数。 2. **创建响应式数据**:在 Vue 实例的 `data` 选项中定义的数据会被 Vue 转换为响应式属性,通过 `Object.defineProperty`(Vue 2)或 `Proxy`(Vue 3)实现数据劫持,使得数据变化时能够通知视图更新。 3. **渲染函数执行**:当 Vue 实例被挂载到 DOM 时,渲染函数会被执行,生成虚拟 DOM 树,并将其渲染为真实 DOM。 4. **依赖收集与更新**:Vue 内部使用 Watcher 对象进行依赖收集,当数据发生变化时,会触发对应的 Watcher 进行更新,进而触发视图的重新渲染Vue 使用异步更新队列优化渲染性能,避免频繁的 DOM 操作 [^1]。 ### 组件渲染机制 Vue 的组件化开发是其区别于传统前端框架的重要特性之一。组件是可复用的 Vue 实例,具有自己的 `template`、`data`、`methods` 等属性。 1. **组件注册与嵌套**:组件可以通过 `components` 选项在父组件中注册,并通过自定义标签在模板中使用。组件之间可以嵌套,形成树状结构。 2. **组件的生命周期**:Vue 提供了组件的生命周期钩子函数(如 `created`、`mounted`、`updated`、`destroyed`),用于在组件不阶段执行特定逻辑。 3. **动态组件与异步组件**:Vue 支持 `<component>` 动态组件和异步组件加载,适用于需要按需加载或延迟渲染的场景。例如,通过 `setTimeout` 控制组件的显示,可以实现延迟渲染的效果 [^3]。 ```javascript export default { data() { return { show: false }; }, methods: { showLazy() { setTimeout(() => { this.show = true; }, 500); } }, created() { this.showLazy(); } }; ``` ### Vue Router 与页面切换 在单页应用(SPA)中,Vue Router 是实现页面切换的核心工具。它通过 `<router-view>` 动态渲染匹配的组件,实现页面内容的切换而无需刷新整个页面。 1. **路由配置**:通过定义路由表,将路径与组件进行映射。 2. **嵌套路由与命名视图**:支持多级嵌套路由和多个 `<router-view>` 的渲染,实现复杂布局的页面切换。 3. **组件复用与重新渲染**:当路由变化时,Vue Router 会复用已有的组件实例。若需要在路由变化时执行某些操作,可通过监听 `$route` 变化来实现 [^2]。 ```javascript watch: { '$route'() { if (!this.trackByData) { this.showLazy(); } } } ``` ### 渲染性能优化 Vue 通过虚拟 DOM 和异步更新机制优化渲染性能: 1. **虚拟 DOM**:Vue 使用高效的虚拟 DOM 算法,通过 diff 算法比较新旧虚拟 DOM 树,仅更新发生变化的部分,减少真实 DOM 操作。 2. **异步更新**:Vue 使用异步队列机制批量更新 DOM,避免重复渲染,提高性能。 3. **组件懒加载**:对于大型应用,可以使用异步组件或路由懒加载技术,按需加载组件资源,减少初始加载时间。 ### 示例:Vue 实例的完整渲染流程 ```javascript import Vue from 'vue'; import App from './App.vue'; import router from './router'; Vue.config.productionTip = false; new Vue({ router, render: h => h(App) }).$mount('#app'); ``` 在上述代码中,Vue 实例挂载到 `#app` 元素,并通过 `render` 函数渲染根组件 `App`,整个应用的页面与组件渲染由此开始 [^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值