0 前言

在 Vue学习笔记11:分别用纯JavaScript和Vue实现显示系统默认值及用户输入数据更新的实时视图显示_PurpleEndurer@5lcto的技术博客_51CTO博客 中,分别用纯JavaScript和Vue实现了显示系统默认值及用户输入数据更新的实时视图显示的功能。

Vue学习笔记12:分别用纯JavaScript和Vue记录和显示用户输入的所有信息(上)_JavaScript

其实我们只显示了用户最后一次输入的信息。

如果我们想记录和显示用户输入的所有信息,分别用纯JavaScript和Vue,该如何实现呢?


1 用Vue实现的思路

我们先用Vue来实现。

实现的思路和技术要点有3点:

  1. 使用数组aRec来存储用户输入的信息
  2. 使用Vue的v-on指令绑定事件,将用户输入的信息存入数组
  3. v-for指令循环输出数组中的信息


2 改造代码

我们以  Vue学习笔记11:分别用纯JavaScript和Vue实现显示系统默认值及用户输入数据更新的实时视图显示_PurpleEndurer@5lcto的技术博客_51CTO博客 中的代码【代码2.3】

<script setup>

import { ref } from 'vue'

var spanMsg = ref("请您输入信息")

var n = 0;
</script>

<template>

<p style="font-size:18pt; font-weight:bold;">
	使用Vue v-once指令显示系统默认值及用户输入数据更新的实时视图显示 
</p>

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

<p>请输入信息:
	  <input type="text" v-model="spanMsg" /> 
</p>

<p style="font-size:18pt; font-weight:bold;">
   系统默认信息是:
   <span v-once style="color:purple" >{{ spanMsg }}</span>
</p>

<p v-if="n++ > 0" style="font-size:18pt; font-weight:bold;">
   您第{{ n-1 }}次输入的信息是:
   <span style="color:purple" >{{ spanMsg }}</span>
</p >

</template>

为基础进行修改。

2.1 改写网页元素描述代码

2.1.1 改写技术说明代码

<p style="font-size:18pt; font-weight:bold;">
	使用Vue v-once指令显示系统默认值及用户输入数据更新的实时视图显示 
</p>

改为

<p style="font-size:18pt; font-weight:bold;">
	使用Vue记录和显示用户输入的所有信息 
</p>

2.1.2 修改用户输入信息的文本框代码

之前我们为文本框设置了默认信息,用来提示用户输入信息,但是用户在输入时一般要删除默认信息。

为了不给用户添加麻烦,我们利用网页元素标签的placeholder属性来描述输入字段预期值的简短的提示信息,这个提示信息会在用户输入值之前显示在输入字段中。

即将:

<p>请输入信息:
	 <input type="text" v-model="spanMsg" />  
</p>

改为

<p>请输入信息:
	 <input type="text" v-model="spanMsg" placeholder="请输入信息" />  
</p>

在placeholder属性中,我们设置提示信息为:请输入信息

2.1.3 增加一个“确定”按钮

因为之前的代码功能实现的是用户每一次按钮我们就记录,这样记录到的信息并不是用户所要输入的完整信息,所以我们要在用户输入信息的文本框后增加一个“确定”按钮,当用户点击这个“确定”按钮,我们才进行记录。

即将:

<p>请输入信息:
	 <input type="text" v-model="spanMsg"  placeholder="请输入信息" />  
</p>

改为:

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


在这里,我们增加了网页元素按钮的的代码,并且用 @click="onClick  绑定了按钮的点击事件。

2.1.4 修改显示信息代码

Vue学习笔记7:使用v-for指令渲染列表_PurpleEndurer@5lcto的技术博客_51CTO博客 中我们曾使用v-for指令来输出水果数组中的信息。

现在,我们将用户每次点击确定按钮后输入的信息存储到数组aRec中,也可使用v-for指令来输出数组aRec中存储的信息。

即将:

<p style="font-size:18pt; font-weight:bold;">
   系统默认信息是:
   <span v-once style="color:purple" >{{ spanMsg }}</span>
</p>

<p v-if="n++ > 0" style="font-size:18pt; font-weight:bold;">
   您第{{ n-1 }}次输入的信息是:
   <span style="color:purple" >{{ spanMsg }}</span>
</p >

改为:

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

因为我们要同时输出用户输入的次数和该次输入的内容,所以我们在v-for指令中使用了v和i两个参数,其中:

i代表用户输入的次数,由于i的值是从0开始的,所以我们在输出时要+1。

v代表用户本次输入的内容,即v=aRec[i]。

2.2 改写JavaScript脚本代码

2.2.1 修改spanMsg的初始值

虽然我们已经使用文本框的placeholder属性设置了提示信息,但是我们已经将文本框的value值与spanMsg作了双向绑定,spanMsg的初始值会显示在文本框中,placeholder属性设置的提示信息就不会显示出来。

为了让placeholder属性设置的提示信息显示出来,我们可以将spanMsg的值设置为空字符串。

即将:

var spanMsg = ref("请您输入信息")

改为

var spanMsg = ref("")

2.2.2 增加数组aRec

我们需要将用户每次输入的信息存储并输出,最方便的莫过于使用数组了。所以我们要定义一个数组aRec,即增加代码:

var aRec = new Array();

2.2.3 增加事件处理函数

我们增加了“确定”按钮,并且绑定了click事件,需要增加一个事件处理函数,即:

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

本来事件处理函数有一个类型为event的隐式传入参数,因为我们不使用这个参数,所以我们就没有指明这个参数。

2.3 改造后的最终代码

综合以上修改后的最终代码如下【代码2.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;">
	使用Vue记录和显示用户输入的所有信息  
</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>

2.4 代码运行效果

Vue学习笔记12:分别用纯JavaScript和Vue记录和显示用户输入的所有信息(上)_提示信息_02

3 小结

我们使用Vue的v-on指令绑定事件和v-for指令循环输出来实现记录和显示用户输入的所有信息的功能。

但是代码运行时还存在一个问题。

在正常情况下,当用户输入信息,点击“确定”按钮完成输入后,就应该输出本次输入的次数和输入的内容。

我们的代码运行时却慢了一拍,当用户输入第n+1一次的信息后,才会显示之前的n次信息。

换而言之,就是页面信息更新不够及时。

这应该与Vue的数据刷新机制有关。

Vue提供了强制更新的方法 ,即this.$forceUpdate(),但是使用这个方法资源开销可能会比较大。

接下来我们会尝试使用其它方法 来解决这个问题。