Vue模板语法详解

vue基础、安装、介绍

    • 双大括号(Mustache语法,又叫胡子语法)
    • v-text
    • v-html
    • v-show
    • v-if、v-else-if、v-else
    • v-show 与 v-if 的区别
    • v-for
    • v-for 中的 key
    • v-if 与 v-for 一起使用
    • v-on(缩写: @)
    • v-bind(缩写: :)
    • v-model
    • v-once
    • v-pre
    • v-cloak(不常用)
    • computed计算属性
    • computed 和 methods 的区别
    • filter过滤器

vue基础、安装、介绍

Vue 实例

    • 双大括号(Mustache语法,又叫胡子语法)
    • v-text
    • v-html
    • v-show
    • v-if、v-else-if、v-else
    • v-show 与 v-if 的区别
    • v-for
    • v-for 中的 key
    • v-if 与 v-for 一起使用
    • v-on(缩写: @)
    • v-bind(缩写: :)
    • v-model
    • v-once
    • v-pre
    • v-cloak(不常用)
    • computed计算属性
    • computed 和 methods 的区别
    • filter过滤器

双大括号(Mustache语法,又叫胡子语法)

动态赋值语法:可使用字段、表达式、函数、三目运算、计算属性、过滤器

<div id="app"><h1>{{firstName+lastName}}</h1><h1>{{firstName}}{{lastName}}</h1><h1>{{firstName ? firstName+lastName : lastName }}</h1><h1>{{getfullName()}}</h1><h1>{{fullName}}</h1><h1>{{ firstName | filterName(lastName) }}</h1>
</div>
<script src="../js/vue.js"></script>
<script>const app = new Vue({el: '#app',data: {firstName: '蔡',lastName: '徐坤'},computed: {fullName() {return this.firstName + this.lastName;}},methods: {getfullName() {return this.firstName + this.lastName;}},filter: {filterName(firstName, lastName ){return firstName + lastName }}})
</script>

v-text

更新DOM的 文本。和 双大括号语法功能一样。不推荐使用

<span v-text="msg"></span>
<span>{{msg}}</span>

v-html

1)更新元素的 innerHTML。内容按普通 HTML 插入 - 不会作为 Vue 模板进行编译。 不推荐使用
2)动态渲染任意 HTML 是非常危险的,容易导致 XSS 攻击。只在可信内容上使用 v-html,永不用在用户提交的内容上。
3)在单文件组件里,scoped 的样式不会应用在 v-html 内部,因为那部分 HTML 没有被 Vue 的模板编译器处理

<div v-html="html"></div>

v-show

1)根据表达式的真假值,切换元素的 display CSS property。
2)通过 v-show 表达式的真假值切换的元素一开始被渲染并始终会保留在 DOM 中。
3)v-show 不支持 <template> 元素,也不支持 v-else

<h1 v-show="isShow">Hello!</h1>
<h1 v-show="!isShow">Hello!</h1>

v-if、v-else-if、v-else

1)Vue的条件指令可以根据表达式的值在DOM中渲染或销毁元素或组件
2)不需要被多余渲染的块可以使用<template> 元素加上v-if,减少结构嵌套
3)下面来看一个经典问题:

<div id="app"><span v-if="isuser"><label for="user">手机登陆</label><input type="text" id="user" placeholder="手机登陆"></span><span v-else><label for="emial">邮箱登陆</label><input type="text" id="emial" placeholder="邮箱登陆"></span><button @click="isuser=!isuser">登录转换</button>
</div><script src="../js/vue.js"></script>
<script>const app = new Vue({el: '#app',data: {isuser: true}})
</script>

问题:我们在有输入内容的情况下,切换了类型,我们会发现文字依然显示之前的输入的内容

原因Vue在进行DOM渲染时,出于性能考虑,会尽可能的复用已经存在的元素,而不是重新创建新的元素。
在上面的案例中,Vue内部会发现原来的input元素不再使用,直接作为else中的input来使用了
解决方案:给对应的input添加key,并且我们需要保证key的不同。让vue重新创建新的元素

  <span v-if="isuser"><input type="text" id="user" placeholder="手机登陆" key=“user”></span><span v-else><input type="text" id="emial" placeholder="邮箱登陆" key="emial"></span>

v-show 与 v-if 的区别

1)都是决定一个内容是否被渲染
2)v-if当条件为false时,压根不会有对应的元素在DOM中
v-show当条件为false时,仅仅是将元素的display属性设置为none而已
3)当需要在显示与隐藏之间切片很频繁时,使用v-show
4)当切换不频繁或需要显示与隐藏的内容比较多时,使用v-if

v-for

1)基于源数据多次渲染元素或模板块
2)此指令之值,必须使用特定语法为当前遍历的元素提供别名

<div v-for="item in items"></div>
<div v-for="(item, index) in items"></div>
<div v-for="(val, key) in object"></div>
<div v-for="(val, key, index) in object"></div>

3)原理上,v-for 的默认行为会尝试原地修改元素而不是移动它们。v-for 循环必须加上 key 属性,在整个 for 循环中 key 需要唯一

<div v-for="item in items" :key="'item' + item.id"></div>
<div v-for="(item, index) in items" :key="'item' + index"></div>

v-for 中的 key

v-if 与 v-for 一起使用

  1. 避免 v-if 和 v-for 同时用在一个元素上(性能问题),v-for 的优先级比 v-if 更高
    两种解决方案:
    将数据替换为一个计算属性,让其返回过滤后的列表
<li v-for="user in activeUsers" :key="user.id">{{ user.name }}
</li>
<script>computed: {activeUsers() {return this.users.filter( user => {return user.isActive})}}</script>

将 v-if 移动至容器元素上 (比如 ul, ol)

<ul v-if="shouldShowUsers"><li v-for="user in users" :key="user.id">{{ user.name }}</li></ul>

v-on(缩写: @)

  1. 绑定事件监听器
  2. 修饰符:
.stop - 调用 event.stopPropagation()。
.prevent - 调用 event.preventDefault()。
.capture - 添加事件侦听器时使用 capture 模式。
.self - 只当事件是从侦听器绑定的元素本身触发时才触发回调。
.{keyCode | keyAlias} - 只当事件是从特定键触发时才触发回调。
.native - 监听组件根元素的原生事件。
.once - 只触发一次回调。
.left - (2.2.0) 只当点击鼠标左键时触发。
.right - (2.2.0) 只当点击鼠标右键时触发。
.middle - (2.2.0) 只当点击鼠标中键时触发。
.passive - (2.3.0) 以 { passive: true } 模式添加侦听器
全部的按键别名:
.enter
.tab
.delete (捕获 “删除” 和 “退格” 键)
.esc
.space
.up
.down
.left
.right
.ctrl
.alt
.shift
.meta
  1. 用法:
    a. 事件类型由参数指定。表达式可以是一个方法的名字或一个内联语句
    b. 如果该方法不需要额外参数,那么方法后的()可以不添加
    c. 如果方法本身中有一个参数,那么会默认将原生事件event参数传递进去
    d.如果需要同时传入某个参数,同时需要event时,可以通过$event传入事件
<!--当监听事件没有参数时,() 可加可不加。  --><button v-on:click="btnclick1">按钮1</button><button v-on:click="btnclick1()">按钮1</button><!-- 当监听事件需要参数的时候,但是在事件定义时,写方法时省略了小括号,这个时候vue会默认将浏览器生产的event事件对象作为参数传入到方法中。 --><button @click="btnclick2">按钮2</button><!-- 监听事件需要参数的时候,但是在事件定义时,写方法时写了小括号,但是没有传参,会默认undefined。 --><button @click="btnclick2()">按钮2</button><!-- 方法定义时,我们需要event对象,同时又需要其他参数, --><!-- 在调用方法时,使用 $event 就能手动获取到浏览器参数的event对象 --><button @click="btnclick3(123,$event)">按钮3</button>

用在普通元素上时,只能监听原生 DOM 事件

在监听原生 DOM 事件时,方法以事件为唯一的参数。如果使用内联语句,语句可以访问一个 $event
<!-- 方法处理器 -->
<button v-on:click="doThis"></button>
<button @click="doThis"></button><!-- 动态事件 (2.6.0+) -->
<button v-on:[event]="doThis"></button>
<button @[event]="doThis"></button><!-- 内联语句 -->
<button v-on:click="doThat('hello', $event)"></button>// 阻止冒泡
<div @click.stop="doSomthing"></div>// 阻止默认行为
<div @click.prevent="doSomthing"></div>
<form @submit.prevent></form>// 只触发一次
<div @click.once="doSomthing"></div>// 串联修饰符
<div @click.stop.prevent="doSomthing"></div>// 键盘修饰符
<div @keyup.enter="doSomthing"></div> // 别名
<div @keyup.13="doSomthing"></div> // 键盘码// 对象语法 (2.4.0+)
<button v-on="{ mousedown: doThis, mouseup: doThat }"></button>//  滚动事件
// .passive 修饰符尤其能够提升移动端的性能
<div @scroll.passive="onScroll">...</div>
//不要把 .passive 和 .prevent 一起使用,因为 .prevent 将会被忽略,同时浏览器可能会向你展示一个警告。

在自定义组件上使用时,可以监听子组件触发的自定义事件。

// 组件中的原生事件
<my-component @click.native="onClick"></my-component> // 不加.native无法触发该事件//内联语句
<my-component @my-event="handleThis(item, $event)" v-for="(item , index) in list" :key="index"></my-component>// 子组件触发事件<my-component @my-event="handleThis"></my-component> // 父组件handleMy() { // 子组件this.$emit('myEvent');}

v-bind(缩写: :)

  1. 动态地绑定一个或多个 属性attribute,或一个组件 prop 到表达式
<!-- 绑定一个 attribute -->
<img v-bind:src="imageSrc">
<img :src="imageSrc"><!-- 动态 attribute 名 (2.6.0+) -->
<button v-bind:[key]="value"></button>
<button :[key]="value"></button><!-- 内联字符串拼接 -->
<img :src="'/path/to/images/' + fileName"><!-- options 绑定。“options”必须在 my-component 中声明。-->
<my-component :options="someThing"></my-component><!-- 通过 $props 将父组件的 props 一起传给子组件 -->
<child-component v-bind="$props"></child-component>

2)绑定 class 或 style attribute 时,支持其它类型的值,如数组或对象
绑定 class

内联字符串拼接语法:
<div  v-for="(item, index) in list" :class="'demo' + index"></div>
对象语法:
//对象表达式
<div  class="demo" :class="{'demo-red': isActive, 'demo-green': !isActive}"></div>
data () {return {isActive: true,}
}
//绑定一个计算属性
<div  class="demo" :class="demoClassInfo"></div>
data () {return {count: 0,}
}
cmputed: {demoClassInfo() {return  {'demo-green': count > 0 && count <= 100  ? true :  false,'demo-red': count > 100 ? true :  false,}}
}
数组语法:
//三元表达式
<div  class="demo" :class="[ isActive ? 'demo-red' : 'demo-green' ]"></div>
data () {return {isActive: true,}
}<div  class="demo" :class="[demoClass1, demoClass2]"></div>
data () {return {demoClass1: 'demo-color',demoClass2: 'demo-size',}
}//绑定一个计算属性
<div  class="demo" :class="demoClassInfo"></div>
data () {return {count: 0,}
}
cmputed: {demoClassInfo() {return  [count > 0 && count <= 100  ? 'demo-green' : '',count > 100 ? 'demo-red' : '']}
}

绑定style
css语法可以使用驼峰式(camelCase)、短横分隔命名(kabab-case)

对象语法:
<div  class="demo" :style="{color: currentColor, fontSize: fontSize + 'px'}"></div>
<div :style="{'flex':(options.negativeRate <= 82 ?  options.negativeRate + ' 1 20%' : '82 0 20%')}"><div  class="demo" :style="demoStyleInfo"></div>data () {return {demoStyleInfo:  {demoColor: 'red',fontSize: '0.24rem'}}
}
数组语法:
<div  class="demo" :style="[demoColor, demoSize]"></div>data () {return {demoStyleInfo:  {demoColor: 'color: red',demoSize: 'fontSize: 0.24rem'}}
}

v-model

  1. 在表单控件或者组件上创建双向绑定
  2. 可以用 v-model 指令在表单 、 及 元素上创建双向数据绑定
    v-model 在内部为不同的输入元素使用不同的 property 并抛出不同的事件:
    text 和 textarea 元素使用 value property 和 input 事件;
    checkbox 和 radio 使用 checked property 和 change 事件;
    select 字段将 value 作为 prop 并将 change 作为事件。
// 文本输入
<input v-model="message" placeholder="edit me">// 多行文本输入
<textarea v-model="message" placeholder="add multiple lines"></textarea>// 单选按钮<input type="radio" id="one" value="One" v-model="picked"><label for="one">One</label><input type="radio" id="two" value="Two" v-model="picked"><label for="two">Two</label><span>Picked: {{ picked }}</span>data: {picked: ''}// 单个复选框,绑定到布尔值
<input type="checkbox" id="checkbox" v-model="checked">
<label for="checkbox">{{ checked }}</label>// 多个复选框,绑定到同一个数组:
<input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
<label for="jack">Jack</label>
<input type="checkbox" id="john" value="John" v-model="checkedNames">
<label for="john">John</label>
<span>Checked names: {{ checkedNames }}</span>
data: {checkedNames: []
}
  1. 修饰符
    .lazy:添加 lazy 修饰符,从而转为在 change 事件_之后_进行同步
    默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步
    .number:自动将用户的输入值转为数值类型
    .trim:自动过滤用户输入的首尾空白字符
<!-- 在“change”时而非“input”时更新 -->
<input v-model.lazy="msg"><input v-model.number="age" type="number"><input v-model.trim="msg">

v-once

只渲染元素和组件一次。随后的重新渲染,元素/组件及其所有的子节点将被视为静态内容并跳过。这可以用于优化更新性能

<!-- 单个元素 -->
<span v-once>This will never change: {{msg}}</span>
<!-- 有子元素 -->
<div v-once><h1>comment</h1><p>{{msg}}</p>
</div>
<!-- 组件 -->
<my-component v-once :comment="msg"></my-component>
<!-- `v-for` 指令-->
<ul><li v-for="i in list" v-once>{{i}}</li>
</ul>

v-pre

跳过这个元素和它的子元素的编译过程。可以用来显示原始 Mustache 标签。
跳过大量没有指令的节点会加快编译。
在这里插入图片描述

v-cloak(不常用)

这个指令保持在元素上直到关联实例结束编译。
和 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 Mustache 标签直到实例准备完毕

computed计算属性

常用场景:在某些情况,我们可能需要对数据进行一些转化后再显示,或者需要将多个数据结合起来进行显示
使用:调用它的时候,就把它当成一个属性来调用就行,不要在后面加括号

computed 和 methods 的区别

1)在双大括号中使用时,方法后有(),而计算属性没有
2)methods 和 computed,功能效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行
3)computed不能接收参数

filter过滤器

<div id="app"><h1>{{ firstName | filterName(lastName) }}</h1>
</div>
<script src="../js/vue.js"></script>
<script>const app = new Vue({el: '#app',data: {firstName: '蔡',lastName: '徐坤'},filter: {filterName(firstName, lastName ){return firstName + lastName }}})
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小白如何从零开始运营微信公众号?

小白如何从零开始运营微信公众号&#xff1f; 一、公众号定位&#xff0c;名称&#xff0c;头像 第一步公众号定位&#xff0c;最重要。如果你自己都讲不清楚自己是干嘛的&#xff0c;还有谁愿意来关注你呢&#xff1f;无论是旅游攻略还是美妆种草&#xff0c;成长干货还是养生…

软件测试技术lab1 2017.3.13

1.安装Junit和Hamcrest 2. 安装Eclemma 3.三角问题的测试用例 4.测试结果及coverage覆盖 转载于:https://www.cnblogs.com/kale12/p/6543904.html

Fiddler 抓包详细使用教程

主要抓包工具介绍与对比&#xff08;一&#xff09;Fiddler介绍&#xff08;二&#xff09;Fiddler与其他工具对比&#xff08;三&#xff09;工作原理&#xff08;四&#xff09;下载安装&#xff08;五&#xff09;Fiddler界面概述1 主菜单说明2. 快捷菜单说明3.会话列表说明…

如何学习微信公众平台的开发?

如何学习微信公众平台的开发&#xff1f; 在整个移动互联网的开发技术中&#xff0c;微信公众号的开发几乎是成本最低&#xff0c;传播最快&#xff0c;影响最广的&#xff0c;你几乎不需要再添加任何配置&#xff0c;就可以开始。 个人可以申请公众号&#xff0c;需要高级权限…

pom.xml配置文件配置jar(不用记,快速配置)

1&#xff1a;网址:http://mvnrepository.com/ 2:在搜索栏搜索要用的框架;例如spring *以下为示例 转载于:https://www.cnblogs.com/kaiwen/p/6545581.html

HTML中各种 div 位置距离关系

HTML中各种 div 位置距离关系一. 盒模型图片展示&#xff1a;二. 位置距离计算属性三. 应用场景一. 盒模型图片展示&#xff1a; 二. 位置距离计算属性 offsetWidth, offsetHeight 获取盒子的宽度/高度&#xff08;包括盒子的border&#xff0c;padding和内容width/height&…

Docker运行操作系统环境(BusyBoxAlpineDebian/UbuntuCentOS/Fedora)

目前常用的Linux发行版主要包括Debian/Ubuntu系列和CentOS/Fedora系列。前者以自带软件包版本较新而出名&#xff1b;后者则宣称运行更稳定一些。选择哪个操作系统取决于读者的具体需求。同时&#xff0c;社区还推出了完全基于Docker的Linux发行版CoreOS。 使用Docker&#xff…

poj1681 Painter's Problem高斯消元

链接http://poj.org/problem?id1681 View Code 1 #include <stdio.h> 2 #include <string.h>3 #include <algorithm>4 #include <cmath>5 using namespace std;6 int d[230][230], N, M;7 char s[16][16]; 8 void solve( int n)9 { 10 int x[230…

小程序、vue 新闻上下轮播

小程序、vue 新闻上下轮播vue小程序红色部分&#xff1a;相当于放映机&#xff0c;也就是容器&#xff0c;overflow&#xff1a;hidden绿色内容&#xff1a;相当于胶片&#xff0c;也就是domvue vue的核心之一&#xff0c;数据驱动模版&#xff0c;循环播放映射的数据上就是 […

ajax.actionlink使用问题

突然发现ajax.actionlink调用的方法全是GET方式的&#xff0c;就算制定了POST也不行&#xff0c;Confirm窗口也弹不出来。。。直接StackOverFlow搜索 ajax.actionlink post not work, 出来一堆结果&#xff0c;有的是因为路由参数不对&#xff0c;有的是回调方法不对&#xff…

CSDN Markdown编辑器编辑教程

目录快捷键文字样式设置&#xff08;字体, 大小, 颜色, 高亮底色&#xff09;内嵌HTML表格定义列表代码块脚注数学公式UML 图:离线写博客常见颜色[TOC](目录)快捷键 - 加粗 Ctrl B - 斜体 Ctrl I - 引用 Ctrl Q- 插入链接 Ctrl L- 插入代码 Ctrl K- 插入图…

一个奇怪的EL表达式错误

下图是在Struts2的action中写的一个方法 JSP页面代码如下&#xff1a; 在页面访问如下路径&#xff1a;http://localhost:8088/maven_ssh/cust_getCustList 目前推测原因是存到session中的对象键值"custList"和action中方法名getCustList冲突了&#xff1f; 各位怎么…

Cntlm安装和配置心得

2019独角兽企业重金招聘Python工程师标准>>> 对于那些使用NTLM进行身份验证的网络代理环境&#xff08;即设置上除需要代理主机和端口之外还需要提供域用户和密码&#xff09;来说&#xff0c;通过代理上网是一件头痛的事情&#xff0c;这主要是因为很多软件不支持N…

vim插件之cscope的安装与配置

本文参考自&#xff1a; http://easwy.com/blog/archives/advanced-vim-skills-cscope/ http://blog.csdn.net/dengxiayehu/article/details/6330200 http://blog.csdn.net/daofengdeba/article/details/7606616 插件介绍&#xff1a; cscope是用来查看源代码的工具&#xff0c…

css媒体查询(手机、平板、PC)

List item css媒体查询PC端按屏幕尺寸整理? 通过上面的电脑屏蔽及尺寸的例表上我们得到了几个宽度 1024 1280 1366 1440 1680 1920 超小屏幕 手机 (<768px) 小屏幕 平板 (≥768px) 中等屏幕 桌面显示器(≥992px) 大屏幕 大桌面显示器 (≥1200px) /* 超小屏幕&#xff08…

破解中国电信华为无线猫路由(HG522-C)自己主动拨号+不限电脑数+iTV

中国电信总是把好好的一个路由猫阉割过后放在我的E家套餐里到处兜售&#xff08;垄断市场也就罢了&#xff0c;还有非常多霸王条款&#xff0c;比方必须使用它们的手机&#xff0c;同一时候最多多少台电脑上网等等&#xff09;&#xff0c;曾经破解过另外一个中国电信的路由猫&…

移动端适配(必须要知道的,亲测有效)

关于移动端适配&#xff08;必须要知道的&#xff0c;亲测有效&#xff09;一、各种单位概念理解二、移动&#xff0c;web开发三、移动端适配1、视口(viewport)概念2、视口(viewport)适配&#xff08;代码&#xff09;3、rem单位适配flexible方案竖屏、横屏、ipad、PC最全的适配…

如何安装MySQL软件

1 双击EXE进行安装&#xff0c;在"Developer Components&#xff08;开发者部分&#xff09;"上左键单击&#xff0c;选择"This feature, and all subfeatures, will be installed on local hard drive."&#xff0c;即"此部分&#xff0c;及下属子部…

前端开发问题记录

小程序开发问题记录多行省略&#xff08;小程序&#xff09;image 图片底部留白单元素如何实现&#xff1a;文本、边框渐变&#xff1b;且边框满足移动端细边框效果&#xff08;小程序&#xff09;在util.js中使用getApp()这个函数&#xff0c;打印显示undefined多行省略 &…

长沙理工大学校园网客户端无法卸载解决办法

2019独角兽企业重金招聘Python工程师标准>>> 删除X:\Program Files (x86)\InstallShield Installation Information\{。。。}目录即可。&#xff08;&#xff09; 转载于:https://my.oschina.net/ZaneYoung/blog/330747