vue 简易学习
好记性不如烂笔头
博客已迁移到CSDN《https://blog.csdn.net/qq_33375499》
最近公司新出一个框架,采用的是前后端分离的开发方式,后端用的是springboot+mybatis(还有额外的zk、缓存、日志等待),前端采用的是vue+es6,由于以前对vue只知其名,不知其意,今天主动去学习了一下vue的基本语法,在此做个记录,方便自己平时查阅及知识分享。如果大家想详细了解,请查阅 https://vuejs.bootcss.com/v2/guide/
vue 的基本语法为:
<div id="app">
......
</div> Vue({
el:"#app" ,
.....
})
其中,el中相关联的id为app的节点,我们称之为挂载点,而挂载点中的内容,称为模版(template)。
1 插值
文本设值:使用文本来进行数据绑定最常见的就是使用Mustache语法(双大括号),也称之为插值表达式,如{{msg}}。该语法不能进行HTML内容的设值,所有的内容都会被编译成文本格式。v-text指令同样能够达到相同效果。
HTML设值: 使用 v-html='msg'的方式,将内容输出为真正的HTML。如:
<span v-html="rawHtml"></span>
内嵌表达式:在vue中,对于所有的数据绑定,都提供了JavaScript表达式支持,如:{{msg === 'yes'?'是':'否'}}、{{msg + ',你好!'}}、{{msg.split('').reverse().toString()}}
2 指令
在vue中,指令(Directives)是带有 v- 前缀的特殊特性。指令的职责是,当表达式值改变时,将其产生的连带影响,响应式的作用域DOM。如: v-if='seen' (seen为true时执行)
一些指令能够接收一个参数,在指令名称之后以冒号 表示,如:
// 绑定href属性
v-bind:href='https://www.cnblogs.com/www-123456/'
// 绑定click事件
v-on:click='click()'
v-bind:常用于对元素属性的绑定添加。可以缩写为 :href='xxx'
v-click:常用于对元素事件进行绑定添加。可以缩写为 @click='xxx'
3 计算属性
模版内的表达式非常便利,但是放入太多,会使代码变得难以理解,并且不能重用(程序猿都是懒人)。所以,对于任何复杂逻辑,你都应该使用计算属性。
计算属性时基于它们的依赖进行缓存。只有相关依赖发生改变时,它们才会重新求值。这意味这只要值没有改变,多次访问同一个属性值,计算属性会立即返回之前的计算结果,而不必再次执行函数。
<div>
<p>{{msg}}</p>
<p>{{reversedMsg}}</p>
</div> var vm = new Vue({
el: '#app',
data: {
msg: 'Hello'
},
computed: {
// 计算属性的 getter
reversedMessage: function () {
// `this` 指向 vm 实例
return this.msg.split('').reverse().join('')
}
}
})
vue 为计算属性提供了getter、setter。计算属性默认只有getter方法。
computed: {
fullName: {
// getter
get: function () {
return this.firstName + ' ' + this.lastName
},
// setter
set: function (newValue) {
var names = newValue.split(' ')
this.firstName = names[0]
this.lastName = names[names.length - 1]
}
}
}
4 侦听器
通过 vue 的 watch 选项,来相应数据的变化。当要在数据变化时执行异步式或开销较大的操作时,这个方式最有用。如:
<script>
var vm= new Vue({
el: '#app',
data: {
question: '',
answer: 'I cannot give you an answer until you ask a question!'
},
watch: {
// 如果 `question` 发生改变,这个函数就会运行
question: function (newQuestion, oldQuestion) {
this.answer = 'Waiting for you to stop typing...'
this.debouncedGetAnswer()
}
}
})
</script>
5 class与style绑定
操作元素的class列表和内联样式是数据绑定的一个常见需求。因为他们都为属性。所有可以用 v-bind 来进行绑定: 只需要通过表达式计算出字符串结果即可。使用 v-bind 来对class 和 style 进行绑定是,除了字符串之外,还可以hi对象和数组。如:
v-bind:class="{active:isActive,'text-dange':hasError}"
// data为:data():{isActive:true,hasError:false}
// 结果为:class='active' v-bind:class="[activeClass, textClass]" v-bind:style="{color:activeColor,fontSize:fonsize}" v-bind:style="styleObj"
// data为:data():{styleObj:{color:'red',fontsize:'14px'}}
6 条件渲染
v-if:当值为true时,该元素快渲染
v-else-if:vue 2.1.0新增
v-else
<div v-if="type==='A'">A</div>
<div v-else-if="type==='B'">B</div>
<div v-else>other</div>
v-show:
<div v-show="yes">yes</div>
v-if 是惰性的,只有当条件为true,才会开始渲染条件快。v-show在初始化就进行了渲染,只是切换元素效果进行宣示与隐藏。
7 列表渲染
使用 v-for 指令遍历数组和对象,语法如下:
// items 为一个可遍历对象
v-for="item in items"
v-for="(item, index) in items"
v-for="item of items"
// object为 key/value 格式对象
v-for="value in object"
v-for='(key, value) in object'
8 事件处理
v-on:click="count += 1" v-on:click='click()' var vm=new Vue({
el:"#app",
data:{count:1} ,
methods:{
click:function(){
this.count += 1;
}
}
})
事件修饰符:.stop .prevent .capture .self .once .passive
<!-- 阻止单击事件继续传播 -->
<a v-on:click.stop="doThis"></a> <!-- 提交事件不再重载页面 -->
<form v-on:submit.prevent="onSubmit"></form> <!-- 修饰符可以串联 -->
<a v-on:click.stop.prevent="doThat"></a> <!-- 只有修饰符 -->
<form v-on:submit.prevent></form> <!-- 添加事件监听器时使用事件捕获模式 -->
<!-- 即元素自身触发的事件先在此处理,然后才交由内部元素进行处理 -->
<div v-on:click.capture="doThis">...</div> <!-- 只当在 event.target 是当前元素自身时触发处理函数 -->
<!-- 即事件不是从内部元素触发的 -->
<div v-on:click.self="doThat">...</div> <!-- 点击事件将只会触发一次 -->
<a v-on:click.once="doThis"></a> <!-- 滚动事件的默认行为 (即滚动行为) 将会立即触发 -->
<!-- 而不会等待 `onScroll` 完成 -->
<!-- 这其中包含 `event.preventDefault()` 的情况 -->
<div v-on:scroll.passive="onScroll">...</div>
使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用 v-on:click.prevent.self 会阻止所有的点击,而 v-on:click.self.prevent 只会阻止对元素自身的点击。
不要把.passive
和.prevent
一起使用,因为.prevent
将会被忽略,同时浏览器可能会向你展示一个警告。请记住,.passive
会告诉浏览器你不想阻止事件的默认行为。
按键修饰符:.enter .tab .delete .esc .space .up .down .left .right
<!-- 只有在 `keyCode` 是 13 时调用 `vm.submit()` -->
<input v-on:keyup.13="submit"> <!-- 同上 -->
<input v-on:keyup.enter="submit"> <!-- 缩写语法 -->
<input @keyup.enter="submit"> // 可以通过全局 config.keyCodes 对象自定义按键修饰符别名,可以使用 `v-on:keyup.f1`
Vue.config.keyCodes.f1 = 112
鼠标按键修饰符:.left .right .middle
8 表单输入绑定
基础语法:
v-model="value1" -> 双向绑定
值绑定:
// 当选中是,vm.toggle == 'yes',当没有选中是 vm.toggle == 'no'
<input type="checkbox" v-model="toggle" true-value="yes" false-value="no" />
<input type="radio" id="one" value="One" v-model="picked"> <select v-model="selected">
<option disabled value="">请选择</option>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
修饰符:
<!-- 在“change”时而非“input”时更新 -->
<input v-model.lazy="msg" > <!--如果想自动将用户的输入值转为数值类型,可以给 v-model 添加 number 修饰符-->
<input v-model.number="age" type="number"> <!--如果要自动过滤用户输入的首尾空白字符,可以给 v-model 添加 trim 修饰符-->
<input v-model.trim="msg">
9 组件基础
每一个组件都是一个Vue实例。这句话非常重要。
组件的注册方式分为两种,全局注册、局部注册。
全局注册:注册之后可以用在任何新创建的Vue根实例(new Vue)的模版中。在所有子组件中也是如此。比如:
Vue.component('component-a', { /* ... */ })
Vue.component('component-b', { /* ... */ })
Vue.component('component-c', { /* ... */ }) new Vue({ el: '#app' })
<div id="app">
<component-a></component-a>
<component-b>
<component-c></component-c>
</component-b>
</div>
局部注册:通过一个普通的JavaScript对象来定义组件,然后在父组件中使用components 选项来定义你想要使用的组件。注意:局部注册的组件在其子组件中不可用。
var ComponentA = { /* ... */ }
var ComponentB = { /* ... */ }
var ComponentC = { /* ... */ } new Vue({
el: '#app',
components: {
'component-a': ComponentA,
'component-b': ComponentB
}
})
9.1 传参
父组件向子组件传值是通过属性的方法,即使用父组件的属性,在子组件中通过props来接受。
子组件向父组件传递参数是通过发布订阅方式。子组件发布一个事件(this.$emit(event,arg))。父组件监听子组件方法的事件 @event。
this.$emit(event,arg):绑定一个自定义事件event,当这个语句被执行时,会将参数arg 传递给父组件,父组件通过 @event 监听并接受该参数。
下面是我自己写的一个列子:
<!DOCTYPE html>
<html>
<head>
<title>vue学习</title>
<script type="text/javascript" src="./vue.js"></script>
</head>
<body>
<div id="app">
<input type="text" name="text" v-model="inputData" />
<button @click="headearClick">提交</button>
<ul>
<li v-for="item in list" :title="item">{{item}}</li>
</ul>
<br />
<br />
要删除的值:<input type="number" v-model.number="number" />
<component-a :data="number" @delete="headearDelete"></component-a>
</div>
</body>
<script type="text/javascript">
Vue.component("component-a", {
props: ["data","index"],
template: '<button @click="click" title="删除无序列表中与输入框值相等">删除</button>',
methods: {
click: function() {
this.$emit("delete", this.data);
}
}
}) new Vue({
el: "#app",
data: {
inputData: "",
list: [],
number: ''
},
methods: {
headearClick() {
if(this.inputData != ""){
this.list.push(this.inputData);
this.inputData = "";
}
},
headearDelete(data) {
var arr = [];
for (var i = 0, len = this.list.length; i < len; i++) {
if(data != this.list[i]){
arr.push(this.list[i]);
}
}
this.list = arr;
this.number = '';
}
}
})
</script>
</html>
注意:我在该代码中引入了vue.js ,小伙伴们可以在 vue的教程https://cn.vuejs.org/v2/guide/installation.html 中查看下载,即 https://vuejs.org/js/vue.js
vue 简易学习的更多相关文章
- vue入门学习(基础篇)
vue入门学习总结: vue的一个组件包括三部分:template.style.script. vue的数据在data中定义使用. 数据渲染指令:v-text.v-html.{{}}. 隐藏未编译的标 ...
- Vue.js学习笔记(2)vue-router
vue中vue-router的使用:
- vue视频学习笔记01
video 1 vue:读音: v-u-eview vue到底是什么?一个mvvm框架(库).和angular类似比较容易上手.小巧mvc:mvpmvvmmv*mvx官网:http://cn.vuej ...
- vue视频学习笔记
video 7 vue问题: 论坛 http://bbs.zhinengshe.com------------------------------------------------UI组件 别人提供 ...
- TensorFlow简易学习[3]:实现神经网络
TensorFlow本身是分布式机器学习框架,所以是基于深度学习的,前一篇TensorFlow简易学习[2]:实现线性回归对只一般算法的举例只是为说明TensorFlow的广泛性.本文将通过示例Ten ...
- vue.js 学习笔记3——TypeScript
目录 vue.js 学习笔记3--TypeScript 工具 基础类型 数组 元组 枚举 字面量 接口 类类型 类类型要素 函数 函数参数 this对象和类型 重载 迭代器 Symbol.iterat ...
- vue.js学习资料
vue.js学习VuejsAPI教程 https://vuejs.org.cn/guide/Vuejs自己的构建工具 http://www.jianshu.com/p/f8e21d87a572如何用v ...
- 在进行vue的学习,项目中需要引入bootstrap、jquery的步骤。
在进行vue的学习,项目中需要引入bootstrap.jquery的步骤. 一.引入jQuery 在当前项目的目录下(就是package.json),运行命令 cnpm install jquery ...
- Vue.js学习笔记:在元素 和 template 中使用 v-if 指令
f 指令 语法比较简单,直接上代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...
随机推荐
- Towers of Hanoi Strike Back (URAL 2029)
Problem The Tower of Hanoi puzzle was invented by French mathematician Édouard Lucas in the second h ...
- Win10 + CLion + 树莓派 + QT 远程开发调用Python
原则:能在一个机器上开发的就不在两台机器上!! 首先需要配置远程QT开发环境 配置Cmake cmake_minimum_required(VERSION 3.14) project(qt_test) ...
- [mysql]my.cnf在哪里
linux mysql --help|grep my.cnf 查找顺序:/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my. ...
- 说说如何使用unity Vs来进行断点调试
转载自:http://dong2008hong.blog.163.com/blog/static/4696882720140293549365/ 大家可以从这下载最新版的unity vs. Unity ...
- python并发——进程间同步和通信
一.进程间同步 对于一些临界资源,不能使用并发无限消耗,就需要设置专门的临界标示,比如锁或者信号量等 from multiprocessing import Process, Lock import ...
- 【软件工程】Beta冲刺(2/5)
链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 新增修改用户信息.任务完成反馈等功能API 服务器后端部署,API接口的bet ...
- SDN上机第4次作业
1. 解压安装OpenDayLight控制器(本次实验统一使用Beryllium版本) 1)JDK的安装与环境配置 嗯,装这个东西还得先装JDK: 在线真人手把手教你安装jdk 输入sud ...
- 搭建Django项目虚拟环境(Windows系统下)
一.安装virtualenv 我们可以使用正式的Python环境中的pip进行安装.进入cmd界面,运行“ pip install virtualenv ”,完成安装后,可以运行“ where vir ...
- 移动端——meta标签
meta标签主要辅助HTML结构层的.meta标签不管在互联网前端还是在移动端都起了很重要的作用. <meta http-equiv="Content-type" conte ...
- Android关闭通知栏后toast无法提示的解决方案
https://github.com/getActivity/ToastUtils PS:release版本注意加上混淆规则