官网: https://cn.vuejs.org
介绍: Vue 是渐进式 Javascript 框架
渐进式: 先使用Vue的核心库,再根据你的需要的功能再去逐渐增加相应的插件。
Vue最核心的功能就是数据渲染
const vm = new Vue({
el: '#app',
data: {
msg: 'Hello Vue.js'
}
})
vm.$el == 代表 Vue 接管的原生DOM 节点
vm.$data == 代表 Vue 的数据模型
<div id="app">
{{msg}}
div>
<script src="https://cn.vuejs.org/js/vue.js">script>
<script src="./vue.js">script>
<script>
const vm = new Vue({
el: '#app',
data: {
msg: 'Hello Vue.js'
}
})
script>
{{xxx}}
这种标记称为插值, 也叫胡子语法
作用就是将 data
中的数据展示在页面上(插值就是用来数据展示的)
插值可以放什么
不可以放什么
<div id="app">
<p>{{ msg }}p>
<p>{{ 100 }}p>
<p>{{ '嗨' }}p>
<p>{{a + 50}}p>
<p>{{msg + ',World'}}p>
<p>{{a % 3}}p>
<p>{{a % 2 === 0 ? '偶数' : '奇数'}}p>
div>
<script src="vue.js">script>
<script>
const vm = new Vue({
el: '#app',
data: {
msg: 'Hello,China',
a: 100
}
})
<p title="{{msg}}">{{msg}}p>
v-
开头, 与 vue 数据项属性绑一起的具有特定功能的属性作用: 列表渲染
注意:
<div id="app">
<ul>
<li v-for="product,index in products">
{{product}} == {{index}}
li>
ul>
div>
<script src="vue.js">script>
<script>
const vm = new Vue({
el: '#app',
data: {
products: [
{
title: '苹果',
price: 8.98
},{
title: '香蕉',
price: 3.45
},{
title: '橘子',
price: 2.9
},{
title: '柚子',
price: 1.98
}
]
}
})
script>
<div id="app">
<ul>
<li v-text="msg">撒li>
<li v-html="msg">撒li>
ul>
div>
<script src="./vue.js">script>
<script>
const vm = new Vue({
el: '#app',
data: {
msg: '你好
'
}
})
script>
<div id="app">
<div class="header" v-if="x > 4">headerdiv>
<div class="content" v-else-if="x > 5">contentdiv>
<div class="footer" v-else>footerdiv>
div>
<script src="https://cn.vuejs.org/js/vue.js">script>
script>
<script>
const vm = new Vue({
el: '#app',
data: {
flag: true,
x: 3
}
})
script>
bind:绑定,我们之前见的bind是函数的一个方法,用来改变this指向的
作用: 动态绑定标签上的属性的值
动态绑定标签上的属性不能使用插值表达式来设置
<元素 v-bind:属性名1="值1" v-bind:属性名2="值3">元素>
简写, 省略 v-bind, 用冒号代替
<h3 class="title" v-bind:class="score > xx ? 'success' : 'error'">h3>
<div
class="static"
v-bind:class="{ active: isActive, 'text-danger': hasError }"
>
div>
<script>
data: {
isActive: true,
hasError: false
}
script>
<div class="static active">div>
<div v-bind:class="classObject">div>
data: {
classObject: {
active: true,
'text-danger': false
}
}
<div v-bind:class="[activeClass, errorClass]">div>
data: {
activeClass: 'active',
errorClass: 'text-danger'
}
<div class="active text-danger">div>
v-bind:style
的对象语法十分直观——看着非常像 CSS,但其实是一个 JavaScript 对象
<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }">div>
data: {
activeColor: 'red',
fontSize: 30
}
直接绑定到一个样式对象通常更好,这会让模板更清晰:
<div v-bind:style="styleObject">div>
data: {
styleObject: {
color: 'red',
fontSize: '13px'
}
}
v-bind:style
的数组语法可以将多个样式对象应用到同一个元素上:
<div v-bind:style="[baseStyles, overridingStyles]">div>
触发 DOM 事件
支持所有的事件名 (所有的原生事件 文档: https://developer.mozilla.org/zh-CN/docs/Web/Events
注意在 html 中:
使用方法
v-on:事件类型=“回调函数”
定义事件回调不要使用箭头函数, 箭头函数的 this 不指向 vm
<标签 v-on:事件名="要执行的代码">标签>
<标签 @事件名="要执行的代码">标签>
<标签 v-on:事件名="methods中的函数">标签>
<标签 v-on:事件名="methods中的函数(实参)">标签>
const vm = new Vue({
el: '#app',
data: {
isVisible: false
},
// 方法选项
methods: {
/*handleClick(){
// this指向当前vue实例
this.isVisible = !this.isVisible
console.log(e)
}*/
handleClick(x,y,e) {
console.log(x + y, e)
}
}
})
什么是事件修饰符?
在事件处理程序中调用 event.preventDefault()
或 event.stopPropagation()
是非常常见的需求.
注意:
使用: v-on:click.prevent.self
会阻止所有的点击, 而v-on:click.self.prevent
只会阻止对元素自身的点击。
修饰符:
.stop
:禁止冒泡,如同原生的stopPropagation()
<div id="app" @click="appClick">
<button @click.stop="btnClick">buttonbutton>
div>
.prevent
:阻止默认行为,如同原生的preventDefault
<a href="http://www.baidu.com" @click.prevent="gotoBaiDu">百度一下a>
.self
:事件作用自己身上才会触发
<div id="app" @click.self="appClick">
<button @click="btnClick">buttonbutton>
div>
.once
:事件只触发一次,该事件触发后就将其移除
<button @click.once="btnClick">buttonbutton>
将 data 中的数据与表单控件中的 value 属性 进行 双向绑定
基本使用:
<div id="app">
<p>{{ username }}p>
<input type="text" v-model="username" placeholder="用户名">
div>
<script>
const vm = new Vue({
el: '#app',
data: {
username: ''
}
})
script>
.lazy
添加 .lazy
修饰符将数据同步时机更改为 change事件
(表单中的值改变的时候) 之后也就是光标离开之后:
<input v-model.lazy="msg">
.trim
清除字符串两端的空白, 这里使用可以清除用户输入失误的空格
<input v-model.number="age" type="number">
.number
自动将用户输入的值转为数字值类型
即使在 type="number"
时,HTML 输入元素的值也总会返回字符串。如果这个值无法被 parseFloat()
解析,则会返回原始的值。
<input v-model.number="age" type="number">
当 vue 内置指令无法满足开发需求的时候就需要自定义指令
注意: 全局/局部 指令一个有 s 一个没有 s ( directive / directives )
局部自定义指令,只在当前 vue 实例中生效
<div id="app">
<p v-hidden="false">{{text}}p>
div>
<script>
var vm = new Vue({
el: '#app',
data: {
text: '学习Vue.js'
},
// 在此自定义指令
directives: {
// 自定义指令的名称,不必添加 v-
hidden: {
// 指令被绑定到某个元素上时,只执行1次
bind: function (el, binding) {
// el 指令所在的元素
// 获取指令相关的参数(各种数据信息) ↓
// console.log(binding);
el.style.display = binding.value ? 'none' : 'block';
},
// 被绑定元素插入父节点时调用
inserted: function (el, binding) {}
},
// 当模板的某些节点发生了变化时, 会执行该回调函数
update(el, binding) {
console.log('发生变化了')
},
// 直接为指令设置成函数, 相当于将 bind 和 inserted 合并
// 可以认为是语法简写
success: function () {
}
}
})
script>
<div id="test">
<p v-success>张贺权大傻叉p>
div>
<script>
// 全局指令定义后, 可以在任何实例中应用
// Vue.directive('指令名称', {指令逻辑})
Vue.directive('success', {
bind() {
console.log('全局指令触发')
}
})
script>
作用: 可以将模板中过多的逻辑和运算拿到外面来 运算/解析
对于任何复杂逻辑,你都应当使用计算属性
小结:
特点/用法:
声明的时候是函数,调用的时候是属性(不能加括号,否则会报做)
返回(return)什么,就展示什么
有缓存,根据依赖进行缓存的,只要依赖变了,计算属性会重新计算;依赖不变,多次调用计算属性会使用第一次缓存的结果,不会重新执行函数体了。
计算属性的依赖:这个计算属性是根据哪个或者哪些数据项计算出来的,那么这些数据项就被称为该计算属性的依赖
小结:
缓存问题, 如果依赖没变,那么多次调用该计算属性 会返回第一次计算后的值,不会再去执行计算属性对应的函数了
<div id="app">
<p>{{reverseMsg()}}p>
<p>{{reverseMsg}}p>
div>
<script>
new Vue({
el: '#app',
data: {
msg: 'helloworld'
},
// 计算属性
computed: {
reverseMsg() {
return this.msg.split('').reverse().join('');
}
}
})
script>
对文本进行格式化处理的工具
<p>{{ message | capitalize }}p>
<p>{{item.price | formatePrice(2)}}p>
<div :id="rawId | formatId">div>
// 第一种(全局定义)
/* 函数的第一个参数是传入当前调用过滤器 的插值表单式
自己传入的参数是第二个形参 */
Vue.filter('formateDate', (input) => {
let date = new Date(input)
let y = date.getFullYear()
let m = date.getMonth() + 1
let d = date.getDate()
// 必须 return 传值
return y + '-' + m + '-' + d
})
// 第二种(局部定义) 在 Vue 实例中定义
/* 函数的第一个参数是传入当前调用过滤器 的插值表单式
自己传入的参数是第二个形参 */
new Vue({
el: '#app',
// 过滤器
filter: {
formatDate(timestamp) {
let dt = new Date(timestamp)
let y = dt.getFullYear()
let m = dt.getMonth() + 1
let d = dt.getDate()
return `${y}-${toDouble(m)}-${toDouble(d)}`
}
}
})
上一个过滤器的输出, 作为下一个过滤器的输入
<p id="app">{{item.status | form1 | form2}}p>
new Vue ({
el: '#app',
filters: {
form1(status) {
xxxxx
return t
},
// 形参接收上一个过滤器函数 return 的值
form2(t) {
xxxx
return 结果
}
}
})
某些复杂的开发场景: 需要开发者能够监听到数据的变化并执行特定的逻辑。
ref
: 属性有点类似之前所学的 html 中的 id
属性,要保证其具有唯一性,否则将出现被覆盖的现象。
**$refs
: **是 Vue 中专门用来获取原生 DOM 节点的实例属性,它专门用于获取具有 ref
属性的节点
<div id="app">
<ul>
<li>
姓名: <input type="text" v-model="username" />
li>
<li>
密码: <input type="password" ref="password" v-model="password" />
li>
<li><input type="button" value="提交" />li>
ul>
div>
<script>
// 实例化
var vm = new Vue({
el: "#app",
data: {
username: '',
password: ''
},
watch: {
// 坚挺 password 数据的变化
password: function (newValue, oldValue) {
var reg = /\d{6}/;
// 检验密码
if(!reg.test(newValue)) {
// 修改输入框颜色
return this.$refs['password'].style.border = '1px solid red';
}
// 恢复输入框颜色
this.$refs.password.style.border = '';
}
}
});
script>
Vue 在插入、更新或者移除 DOM 时,提供多种不同方式的应用过渡效果,用来增强用户体验:
<style>
.box {
width: 200px;
height: 200px;
background-color: pink;
transition: 1s;
opacity: 1;
}
/* .active {
width: 240px;
height: 300px;
background-color: red;
} */
.v-enter {
opacity: 0;
width: 400px;
}
.v-enter-to {
opacity: 1;
}
.v-enter-active {
transition: 10s;
}
.v-leave {
opacity: 1;
}
.v-leave-to {
opacity: 0;
}
.v-leave-active {
transition: 10s;
}
style>
<div id="app">
<button @click="seen = !seen">切换button>
<transition>
<div class="box" v-if="seen">div>
transition>
div>
<script src="./libs/vue.js">script>
<script>
const vm = new Vue({
el: '#app',
data: {
seen: false
}
})
script>