第3章Vue的内置指令与语法 视频讲解 本章将会对Vue 3.0中的语法和内置指令进行介绍,包括插值绑定、计算属性、条件渲染指令、列表渲染指令等,对于在Vue 3.0中有变更的部分会在对应的小节中进行说明。 3.1插 值 绑 定 3.1.1文本插值与表达式 文本插值最基本的方法是使用双大括号(Mustache语法)“{{ }}”,Vue将会获取计算后的值,将大括号里的内容替换为设定值,然后以文本的形式将其展示出来。无论通过任何方法修改数据设定值,大括号的内容都会被实时替换。例22中的hello、例25中的a、b、c都是通过这种方式在页面中显示数据的。 除了直接赋值,Mustache语法也接受表达式形式的值。表达式可由JavaScript表达式和过滤器构成。表达式可以有变量、数值、运算符等,表达式的值是它的运算结果。虽然不支持条件语句,但可以通过三元式实现简单的条件判断。 例31展示了通过文本插值与表达式计算变量、表达式、条件运算符的值,在页面中的效果如图31所示。 【例31】通过文本插值计算变量、表达式、条件运算符的值 图31通过文本插值显示 变量、表达式、条件 运算符值的效果 Vue的“{{ }}”内只支持单个表达式,不支持语句和流控制。并且在表达式中,不能使用用户自定义的全局变量。“{{ }}”可以放在HTML标签内,但Vue指令和自身特性内是不可以插值的。 如果想显示“{{ }}”标签而不进行替换,可以使用vpre跳过这个元素和它的子元素的编译过程。此外,HTML绑定Vue实例,在页面加载时可能会闪烁。原因是Vue来不及渲染,页面显示出了Vue源代码,可以使用vcloak指令隐藏未编译的Mustache标签直到实例准备完毕。 3.1.2过滤器 在Vue 2.x中支持在“{{ }}”插值的尾部添加过滤器,用管道符“|” 表示。经常用于格式化文本,如字母全部大写、格式化日期等。过滤的规则是可以自定义的,通过给Vue实例添加filters来设置。在Vue 3.0中,过滤器已被移除,建议使用方法或计算属性来实现。 下面的例32实现了内置过滤器、过滤器串联与过滤器传参。uppercase是Vue的一个内置过滤器,可以将字符串转换为大写。通过使用多个管道符号可以将多个过滤器进行串联。 【例32】内置过滤器、过滤器串联与过滤器传参 {{ string | uppercase }} {{ string | filterA | filterB }} {{ string | filter arg1 arg2 }} 当有多个参数时,可以通过空格将参数分开,过滤器会将string作为第一个参数,arg1、arg2分别作为第二个、第三个参数传入。参数可以是表达式,也可以使用单引号传入字符串。 包括uppercase,Vue总共内置了10种过滤器,将会在第5章进行详细介绍。 3.1.3HTML插值 HTML插值可以动态渲染DOM节点,常用于处理开发者不可预知和难以控制的DOM 结构。与文本插值不同的是,文本插值中的代码被解释为节点的文本内容,而HTML插值中的代码则被渲染为视图节点。 对于值是HTML的片段,可以使用三个大括号“{{{ }}}”来绑定,也可以在标签内使用vhtml=" "的形式。所接收的字符串不会进行编译等操作,Vue会把被绑定的内容解析为DOM节点,按照普通HTML处理,从而实现动态渲染视图的效果。 需要注意的是,在网站上直接动态渲染任意HTML片段,容易导致XSS(Cross Site Scripting,跨站脚本攻击)。因此,开发者应尽量多地使用Vue自身的模板机制,减少对HTML插值的使用,并且只对可信内容使用HTML插值。 3.2计 算 属 性 在项目开发中,往往会在模板中使用表达式或过滤器来对数据进行处理。当表达式过长或者逻辑更复杂时,模板就会变得难以维护。为了避免这种问题,Vue提供了计算属性,对逻辑进行简化。 3.2.1计算属性的概念 计算属性会在其依赖属性的值发生变化时,对属性的值进行自动更新,同时更新相关的DOM 部分。通过从Vue中导入computed来使用计算属性。 例33给出了计算属性的例子,double会始终保持为num的两倍,使用按钮增加num的值,double也会随之改变。显示结果如图32所示。在Vue Devtools中可以查看计算属性的值,如图33所示。 【例33】计算属性 图32计算属性的显示 图33在Vue Devtools中查看属性 除了以上这种写法,也可以将computed写在data中,同样可以达到相同的效果,如例34所示。 【例34】计算属性的另一种写法 const data = reactive({ num: 1, doubleNum: computed(() => data.num * 2), }); 3.2.2计算属性 在例33中,如果尝试修改double的值,会发现Vue会给出一个warning,原因是所创建的double是只读的计算属性。通过传入一个包含get和set函数的对象,可以得到一个可读可写的计算属性。 图34修改tripple前后的结果 在例35中创建了一个可读可写的计算属性tripple,它的值会保持为num的三倍。单击按钮将tripple的值修改为9,此时num的值也会被一同修改为3。修改前后的结果如图34所示。 【例35】可读可写的计算属性 const tripple = computed({ get: () => data.num * 3, set: (val) => { data.num = val / 3; }, }); 在computed中,get是取值函数,set是赋值函数。为计算属性赋值时,会触发set函数,触发set函数后,num的值会被更新。 3.2.3侦听属性 watch函数用来监视指定数据项的变化,从而触发用户自定的操作。watch API完全等同于选项式API this.$watch。watch需要指定侦听的数据源,并在回调函数中执行副作用。默认情况下,回调仅在侦听的数据源发生改变时调用。通过从Vue中导入watch函数来使用侦听属性。 例36给出了使用watch函数侦听reactive类型的num与ref类型的count的例子。watch可以获取新值与更新前的值,当num与count改变时,会执行回调函数,在控制台打印更新前后的值。页面布局与控制台输出结果分别如图35与图36所示。 【例36】侦听num与count并打印变化 //侦听reactive类型的数据源 const data = reactive({ num: 1, }); watch( () => data.num, (newNum, oldNum) => { console.log("newNum = ", newNum); console.log("oldNum = ", oldNum); } ); //侦听ref对象 const count = ref(0); watch(count, (newCount, oldCount) => { console.log("newCount = ", newCount); console.log("oldCount = ", oldCount); }); 图35页面布局 图36控制台输出结果 侦听器还可以使用数组同时侦听多个源,如例37所示。 【例37】侦听多个数据源 //侦听多个reactive类型 watch( [() => data.num1, () => data.num2], ([newNum1, newNum2], [prevNum1, prevNum2]) => { //Do something } ); //侦听多个ref类型 watch( [count1, count2], ([newCount1, newCount2], [prevCount1, prevCount2]) => { //Do something } ); 3.3vbind属性绑定 除了文本之外,DOM节点还有一些其他重要的属性,这些属性基本都可以用指令vbind进行绑定。 3.3.1vbind指令 vbind指令主要用于动态绑定DOM元素属性,可以将一个或多个attribute,或一个组件prop动态地绑定到表达式,如例38所示。 【例38】vbind示例 3.3.2绑定class、style与prop vbind在绑定class或style的attribute时,支持其他类型的值,如数组或对象。虽然类名class和样式style可接收的类型都是字符串,但类名实际上是由数组拼接而成的,而样式则是由对象键值对拼接而成的。 在绑定 prop时,prop必须在子组件中声明。可以用修饰符指定不同的绑定类型,如例39所示。 【例39】绑定class、style、prop的attribute
其中,类名classB与classC分别依赖于数据isB和isC,当isB和isC为true时,div会拥有类名classB与classC; 反之则没有。另外,可以使用三元表达式来根据条件切换类名。 使用: style时,CSS属性名称使用驼峰命名(camelCase)或短横分隔命名(kebabcase)。Vue会自动给特殊的CSS属性名称增加前缀,比如transform。 3.4vmodel双向绑定 表单控件在项目中十分常用,如输入框、选择等,用它们可以完成数据的录入、提交等操作。通过使用指令vmodel可以完成表单的数据双向绑定。 3.4.1vmodel指令 vmodel指令用于在
Multiline message is:

{{ mulMessage }}



Selected: {{ selected }} 图37元素值更新前后 需要注意的是,在文本区域
备注:

{{ mulMessage }}


图38问卷采集前后的效果 图39在Vue Devtools中查看问卷数据 可以看到,当每次在表单控件中输入信息时,数据会实时地显示在页面中,而不需要对页面进行刷新操作。打开Vue Devtools,可以看到具体的数据内容以及对应的类型,每次对问卷中信息的修改也会直接反映在数据上,如图39所示。 3.5vif/vshow条件渲染 类似于其他程序中的条件语句if、else、else if,Vue的条件指令同样可以根据表达式的值,在DOM中渲染或销毁元素与组件,称为条件渲染。 3.5.1vif、velseif与velse指令 vif指令用于条件性地渲染一块内容,这块内容只会在指令的表达式返回真值的时候被渲染。 velseif用于充当vif的“elseif块”,要紧跟vif。当vif中的表达式返回值为假时,开始判断velseif的表达式值,并根据返回值真假进行渲染。velseif可以连续使用。 velse用来表示vif的“else 块”,要紧跟velseif或vif,当velseif与vif的表达式值均为假时,渲染velse中的内容。 在例312中使用了vif、velseif与velse进行条件渲染,当type的值为'A'时,在页面中显示'A',为'B'时显示'B',为'C'时显示'C',其他情况下显示'Not A/B/C'。 【例312】根据type进行条件渲染 其中,在进行相等的条件判断时,应该使用===。===是Ecmascript的语言,表示严格等于判断,由于JavaScript中的==有缺陷,因此在绝大多数情况下,都是使用三个等号的形式。 因为vif是一个指令,所以必须将它添加到一个元素上。因此,如果想要一次判断多个元素,可以把一个Vue内置的