0
点赞
收藏
分享

微信扫一扫

Vue学习笔记15:不用v-if指令解决数据更新后的页面刷新问题

0 前言

在 Vue学习笔记14:使用v-if指令解决数据更新后的页面刷新问题_PurpleEndurer@5lcto的技术博客_51CTO博客 中, 为了在数据更新后及时刷新页面显示,我们是增加了数据成员c,并利用了v-if指令。最后的小结中我们提到,数据成员c的值和保存用户输入信息的数组aRec的内容,或者元素数量(也就是数组长度),是同步更新的,那么我们是否可以不增加数据成员c,直接使用数组aRec的变化来作为v-if指令的判断条件呢?这次我们就来试试看。

1 第1次改造代码

我们以 Vue学习笔记14:使用v-if指令解决数据更新后的页面刷新问题_PurpleEndurer@5lcto的技术博客_51CTO博客 中的最终代码

<script setup>

import { ref } from 'vue'

var spanMsg = ref("")

var aRec = new Array();

var c = ref(1);//用于v-if语句的判断条件

function onClick()
{
  c.value++;//更新c的值,从而让v-if指令及时生效
	aRec.push(spanMsg.value);//将用户输入的信息存储到数组末尾
}

</script>

<template>

<p style="font-size:18pt; font-weight:bold;">
	引入v-if指令完善记录和显示用户输入的所有信息功能
</p>

<p style="margin-left:20%; color:purple; font-weight:bold;">
	by PurpleEndurer
</p>

<p>请输入信息:
	  <input type="text" v-model="spanMsg"  placeholder="请输入信息" />  
    <input type="button" value="确定" @click="onClick" />
</p>

 <div v-if="(c > 0)"  v-for="(v, i) in aRec">
   <p>第{{ i+1 }}次输入:{{ v }}</p>
</div>

</template>

为基础进行改造。

1.1 改写网页元素描述代码

1.1.1 改写技术说明代码

将第21-23行代码

<p style="font-size:18pt; font-weight:bold;">
	引入v-if指令完善记录和显示用户输入的所有信息功能
</p>

改为

<p style="font-size:18pt; font-weight:bold;">
	改造v-if指令条件优化记录和显示用户输入的所有信息功能
</p>

1.1.2 改写v-if条件语句

将第34-36行代码

<div v-if="(c > 0)"  v-for="(v, i) in aRec">
   <p>第{{ i+1 }}次输入:{{ v }}</p>
</div>

改为

<div v-if="(aRec.length > 0)"  v-for="(v, i) in aRec">
   <p>第{{ i+1 }}次输入:{{ v }}</p>
</div>

主要是将 v-if="(c > 0)"   改为 v-if="(aRec.length > 0)"

1.2  改写JavaScript脚本代码

由于我们不再使用数据成员c,所以我们要删除数据成员c的定义语句,即删除第9行语句:

var c = ref(1);//用于v-if语句的判断条件


1.3 第1次修改的最终代码

综合以上修改后的完整代码为【代码1.3】:

<script setup>

import { ref } from 'vue'

var spanMsg = ref("")

var aRec = new Array();

function onClick()
{
	aRec.push(spanMsg.value);//将用户输入的信息存储到数组末尾
}

</script>

<template>

<p style="font-size:18pt; font-weight:bold;">
	改造v-if指令条件优化记录和显示用户输入的所有信息功能
</p>

<p style="margin-left:20%; color:purple; font-weight:bold;">
	by PurpleEndurer
</p>

<p>请输入信息:
	  <input type="text" v-model="spanMsg"  placeholder="请输入信息" />  
    <input type="button" value="确定" @click="onClick" />
</p>

 <div v-if="(aRec.length > 0)"  v-for="(v, i) in aRec">
   <p>第{{ i+1 }}次输入:{{ v }}</p>
</div>

</template>

1.4 运行效果

Vue学习笔记15:不用v-if指令解决数据更新后的页面刷新问题_Vue

很不幸,代码运行时又慢了一拍,当用户输入第n+1一次的信息后,才会显示之前的n次信息的问题又出现了。

2 分析原因

我们在onClick()函数中:

function onClick()
{
  c.value++;//更新c的值,从而让v-if指令及时生效
	aRec.push(spanMsg.value);//将用户输入的信息存储到数组末尾
}

明明先后更新了数据成员 c 和 数组aRec 的值,为什么将 v-if="(c > 0)"   改为 v-if="(aRec.length > 0)"就出现问题呢?

对比 数据成员 c 和 数组aRec 的定义,数据成员 c 是使用ref()定义的,而数组aRec不是使用ref()定义的。

就是这个差别导致了问题吗?

我们测试看看。

3 第2次改造代码

需要改写的主要是JavaScript脚本代码。

3.1 改写 数组aRec 的定义

var aRec = new Array();

改为

var aRec = ref([]);

3.2 改写onClick()函数

因为数组aRec改用ref()来定义了,那么我们的操作它的语句要作相应修改。

在本例中主要是要将onClick()函数中的语句

aRec.push(spanMsg.value);//将用户输入的信息存储到数组末尾

改为

aRec.value.push(spanMsg.value);//将用户输入的信息存储到数组末尾

这是因为aRec的值存储在它的value属性里面。

在javaScript脚本中,我们要显示地指定value属性。

3.3 第2次修改的最终代码

综合以上修改后的完整代码为【代码2.3】:

<script setup>

import { ref } from 'vue'

var spanMsg = ref("");

var aRec = ref([]);

function onClick()
{
	aRec.value.push(spanMsg.value);//将用户输入的信息存储到数组末尾
}

</script>

<template>

<p style="font-size:18pt; font-weight:bold;">
	改造v-if指令条件优化记录和显示用户输入的所有信息功能
</p>

<p style="margin-left:20%; color:purple; font-weight:bold;">
	by PurpleEndurer
</p>

<p>请输入信息:
	  <input type="text" v-model="spanMsg"  placeholder="请输入信息" />  
    <input type="button" value="确定" @click="onClick" />
</p>

 <div v-if="(aRec.length > 0)"  v-for="(v, i) in aRec">
   <p>第{{ i+1 }}次输入:{{ v }}</p>
</div>

</template>

3.4 运行效果

Vue学习笔记15:不用v-if指令解决数据更新后的页面刷新问题_数组_02

这次代码运行正常,没有出现更新滞后的问题。

4 去掉v-if指令

我们之前增加v-if指令是为了解决网页未能及时更新的问题,现在我们已经改用ref()来定义数组aRec,那么是否还需要v-if指令呢?

我们来试试看。

首先,我们把代码

<div v-if="(aRec.length > 0)"  v-for="(v, i) in aRec">

改为

<div v-for="(v, i) in aRec">

也就是删除 v-if="(aRec.length > 0)" 

然后,我们修改技术说明代码。

<p style="font-size:18pt; font-weight:bold;">
	改造v-if指令条件优化记录和显示用户输入的所有信息功能
</p>

改为

<p style="font-size:18pt; font-weight:bold;">
	不用v-if指令条件优化记录和显示用户输入的所有信息功能
</p>

最终代码为【代码4】:

<script setup>

import { ref } from 'vue'

var spanMsg = ref("");

var aRec = ref([]);

function onClick()
{
	aRec.value.push(spanMsg.value);//将用户输入的信息存储到数组末尾
}

</script>

<template>

<p style="font-size:18pt; font-weight:bold;">
	不用v-if指令条件优化记录和显示用户输入的所有信息功能
</p>

<p style="margin-left:20%; color:purple; font-weight:bold;">
	by PurpleEndurer
</p>

<p>请输入信息:
	  <input type="text" v-model="spanMsg"  placeholder="请输入信息" />  
    <input type="button" value="确定" @click="onClick" />
</p>

 <div v-for="(v, i) in aRec">
   <p>第{{ i+1 }}次输入:{{ v }}</p>
</div>

</template>

运行效果如下:

Vue学习笔记15:不用v-if指令解决数据更新后的页面刷新问题_数组_03

可见,即使没有v-if指令,网页内容也能在数据更新时及时刷新。

5 小结

今天,我们通过修改数组aRec的定义方式,不用v-if指令,也能实现数据更新时网页内容也能及时更新。

所以,在Vue中,我们要注意数据成员变量的定义方法,充分使用和发挥ref()的特性。

6 改进和拓展

有时用户输入的信息是相同的,我们是否可以对用户输入的信息做进一步的统计和分析呢?

比如,当用户新输入的信息与之前输入过的信息相同时,我们是否可以统计并输出这个信息重复的次数呢?




举报

相关推荐

0 条评论