这里可以参考:创建第一个Vue2项目-----HelloWorld
DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>初始Vuetitle>
<script src="../js/vue.js">script>
head>
<body>
<div id="root">
<h1>hello{{name}}h1>
div>
<script>
Vue.config.productionTip = false //阻止 vue 在启动时生成产生提示。
// 创建Vue实例
new Vue({
el:'#root', //el用于指定当前Vue实例为那个容器服务,值通常为css选择器字符串。
data:{
//data用于存储数据,数据供el指定的容器使用,暂时写成一个对象
name:'World'
}
})
script>
body>
html>
这里的两个大括号就是模板语法,放到里面的数据不会按照字符串来显示,而是会作为 js 表达式解析,且可以直接读取到data中的所有属性。
v-bind:href="xxx"
或简写为 :href
v-mode:value="xxx"
或简写为 v-model="xxx"
data与el的2种写法
<script>
Vue.config.productionTip = false
// el的两种写法
/*const v = new Vue({
// el:'#root', //第一种写法
data:{
name:'张三'
}
})
console.log(v);
// 这样也能绑定#root,类似(el:'#root')且更灵活
v.$mount = ('#root') //第二种写法*/
// data的两种写法
const v = new Vue({
el:'#root',
// data的第一种写法,对象式
// data:{
// name:'张三'
// }
//data的第二种写法,函数式
data(){
console.log('@@@',this);
return {
name:'张三'
}
}
})
console.log(v);
</script>
v-on:click
或@click
如果你有想传参,有向有 $event
可以试试@click="demo($event, value)"
prevent:阻止默认事件(常用);
点我提示信息
可以触发click事件且不跳转到百度。
stop:阻止事件冒泡(常用);
<div class="demo1" @click="showInfo">
<button @click.stop="showInfo">点我提示信息button>
div>
点击button按钮后,不会触发button按钮下div的click事件
once:事件只触发一次(常用);
这个click事件只会触发一次。触发一次后即失效了。
capture:使用事件的捕获模式;
<div class="box1" @click.capture="showMsg(1)">
div1
<div class="box2" @click="showMsg(2)">
div2
div>
div>
div1的click事件里面的函数代码先执行
<div class="demo1" @click.self="showInfo">
<button @click="showInfo">点我提示信息button>
div>
<ul @wheel.passive="demo" class="list">
<li>1li>
<li>2li>
<li>3li>
<li>4li>
ul>
Vue未提供别名的按键,可以使用按键原始的key值去绑定,但注意要转为kebab-case(短横线命名)
系统修饰键(用法特殊):ctrl、alt、shift、meta
(1).配合keyup使用:按下修饰键的同时,再按下其他键,随后释放其他键,事件才被触发。
(2).配合keydown使用:正常触发事件。
也可以使用keyCode去指定具体的按键(不推荐)
Vue.config.keyCodes.自定义键名 = 键码,可以去定制按键别名
回车 => enter
删除 => delete (捕获“删除”和“退格”键)
退出 => esc
空格 => space
换行 => tab (特殊,必须配合keydown去使用)
上 => up
下 => down
左 => left
右 => right
<script>
Vue.config.productionTip = false
const vm = new Vue({
el:'#root',
data:{
firstName:'张',
lastName:'三'
},
computed:{
fullName:{
// get有什么作用?当有人读取fullName时,get就会被调用,且返回值就做为fullName值
// get什么时候调用?1.初次读取fullName时。2.所依赖的数据发生变化时。
get(){
console.log('get被调用了');
return this.firstName + '-' + this.lastName;
},
// set什么时候调用?当fullName被修改时
set(value){
const arr = value.split('-');
this.firstName = arr[0];
this.lastName = arr[1];
}
}
}
})
</script>
简写只能当不修改fullName
时,也就是确定不会使用到set
fullName(){
console.log('get被调用了');
return this.firstName + '-' + this.lastName;
}
<script>
Vue.config.productionTip = false
const vm = new Vue({
el:'#root',
data:{
isHot:true
},
computed:{
info(){
return this.isHot? '炎热':'凉爽';
}
},
methods:{
changeWeather() {
this.isHot = !this.isHot;
}
},
watch:{
isHot:{
// handler什么时候调用?当isHot发生改变时。
handler(newValue,oldValue){
console.log('isHot发生修改了',newValue,oldValue);
}
}
}
})
</script>
<script>
Vue.config.productionTip = false
const vm = new Vue({
el:'#root',
data:{
isHot:true
},
computed:{
info(){
return this.isHot? '炎热':'凉爽';
}
},
methods:{
changeWeather() {
this.isHot = !this.isHot;
}
}
})
vm.$watch('isHot',{
// handler什么时候调用?当isHot发生改变时。
handler(newValue,oldValue){
console.log('isHot发生修改了',newValue,oldValue);
}
})
</script>
备注:
isHot:{
immediate:true,//初始化时让handler调用一下
deep:true, // 深度监视
handler(newValue,oldValue){
console.log('isHot发生修改了',newValue,oldValue);
}
}
vm.$watch('isHot',{
immediate:true,//初始化时让handler调用一下
deep:true, // 深度监视
handler(newValue,oldValue){
console.log('isHot发生修改了',newValue,oldValue);
}
})
在想简写的情况下,只能是不在深度监视,不在初始化就让handler调用一下的情况下。
isHot(newValue,oldValue){
console.log('isHot发生修改了',newValue,oldValue);
}
vm.$watch('isHot',function(newValue,oldValue){
console.log('isHot发生修改了',newValue,oldValue);
})
<div id="root">
<div class="basic" :class="mood" @click="changeMood">{{name}}div> <br/><br/>
<div class="basic" :class="classArr">{{name}}div> <br/><br/>
<div class="basic" :class="classObj">{{name}}div> <br/><br/>
div>
<script>
Vue.config.productionTip = false
new Vue({
el:'#root',
data:{
name:'张三',
mood:'norml',
classArr:['atname1', 'atname2', 'atname3'],
classObj:{
atname1:true,
atname2:false
}
methods:{
changeMood(){
const arr = ['happy', 'sad', 'normal'];
const index = Math.floor(Math.random()*3);
this.mood = arr[index];
}
}
})
</script>
<div id="root">
<div class="basic" :style="styleObj">{{name}}div> <br/><br/>
<div class="basic" :style="[styleObj,styleObj2]">{{name}}div> <br/><br/>
<div class="basic" :style="styleArr">{{name}}div>
div>
<script>
Vue.config.productionTip = false
new Vue({
el:'#root',
data:{
name:'张三',
mood:'norml',
styleObj:{
fontSize: '40px',
color:'red',
},
styleObj2:{
backgroundColor:'orange'
},
styleArr:[
{
fontSize: '40px',
color:'blue',
},
{
backgroundColor:'gray'
}
]
},
methods:{
changeMood(){
const arr = ['happy', 'sad', 'normal'];
const index = Math.floor(Math.random()*3);
this.mood = arr[index];
}
}
})
</script>
(1).v-if=“表达式”
<h2 v-if="false">欢迎来到{{name}}h2>
<h2 v-if="1 === 1">欢迎来到{{name}}h2>
(2).v-else-if=“表达式”
(3).v-else=“表达式”
<div v-if="n === 1">Angulardiv>
<div v-else-if="n === 2">Reactdiv>
<div v-else-if="n === 3">Vuediv>
<div v-else>哈哈div>
适用于:切换频率较低的场景。
特点:不展示的DOM元素直接被移除。
注意:v-if可以和:v-else-if、v-else一起使用,但要求结构不能被“打断”。
<h2 v-show="false">欢迎来到{{name}}h2>
<h2 v-show="1 === 1">欢迎来到{{name}}h2>
1 .用于展示列表数据
2. 语法:v-for=“(item, index) in xxx” :key=“yyy”
3. 可遍历:数组、对象、字符串(用的很少)、指定次数(用的很少)
<div id="root">
<h2>人员列表(遍历数组)h2>
<ul>
<li v-for="(p,index) of persons" :key="index">
{{p.name}}-{{p.age}}
li>
ul>
<h2>汽车信息(遍历对象)h2>
<ul>
<li v-for="(value,k) of car" :key="k">
{{k}}-{{value}}
li>
ul>
<h2>测试遍历字符串(用得少)h2>
<ul>
<li v-for="(char,index) of str" :key="index">
{{char}}-{{index}}
li>
ul>
<h2>测试遍历指定次数(用得少)h2>
<ul>
<li v-for="(number,index) of 5" :key="index">
{{index}}-{{number}}
li>
ul>
div>
<script type="text/javascript">
Vue.config.productionTip = false
new Vue({
el:'#root',
data:{
persons:[
{id:'001',name:'张三',age:18},
{id:'002',name:'李四',age:19},
{id:'003',name:'王五',age:20}
],
car:{
name:'奥迪A8',
price:'70万',
color:'黑色'
},
str:'hello'
}
})
</script>
虚拟DOM中key的作用:
key是虚拟DOM对象的标识,当数据发生变化时,Vue会根据【新数据】生成【新的虚拟DOM】,
随后Vue进行【新虚拟DOM】与【旧虚拟DOM】的差异比较,比较规则如下:
对比规则:
用index作为key可能会引发的问题:
若对数据进行:逆序添加、逆序删除等破坏顺序操作:
会产生没有必要的真实DOM更新 ==> 界面效果没问题, 但效率低。
如果结构中还包含输入类的DOM:
会产生错误DOM更新 ==> 界面有问题。
开发中如何选择key?:
Vue监视数据的原理:
vue会监视data中所有层次的数据。
如何监测对象中的数据?
通过setter实现监视,且要在new Vue时就传入要监测的数据。
(1).对象中后追加的属性,Vue默认不做响应式处理
(2).如需给后添加的属性做响应式,请使用如下API:
Vue.set(target,propertyName/index,value) 或 vm.$set(target,propertyName/index,value)
例如:Vue.set(this.student,'sex','男');
或 vm.$set(this.student,'sex','男');
如何监测数组中的数据?
通过包裹数组更新元素的方法实现,本质就是做了两件事:
(1).调用原生对应的方法对数组进行更新。
(2).重新解析模板,进而更新页面。
在Vue修改数组中的某个元素一定要用如下方法:
特别注意:Vue.set() 和 vm.$set() 不能给vm 或 vm的根数据对象 添加属性!!!
若:,则v-model收集的是value值,用户输入的就是value值。
若:,则v-model收集的是value值,且要给标签配置value值。
若:
备注:v-model的三个修饰符:
lazy:失去焦点再收集数据
number:输入字符串转为有效的数字
trim:输入首尾空格过滤
定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理)。
语法:
备注:
<div id="root">
<h2>显示格式化后的时间h2>
<h3>现在是:{{fmtTime}}h3>
<h3>现在是:{{getFmtTime()}}h3>
<h3>现在是:{{time | timeFormater}}h3>
<h3>现在是:{{time | timeFormater('YYYY_MM_DD') | mySlice}}h3>
<h3 :x="msg | mySlice">尚硅谷h3>
div>
<div id="root2">
<h2>{{msg | mySlice}}h2>
div>
Vue.filter('mySlice',function(value){
return value.slice(0,4)
})
注意:必须在new Vue实例之前定义全局过滤器
filters:{
timeFormater(value,str='YYYY年MM月DD日 HH:mm:ss'){
// console.log('@',value)
return dayjs(value).format(str)
}
}
注意:filters与Vue实例中的data平级
v-text指令:
<div id="root">
<div>你好,{{name}}div>
<div v-text="name">div>
<div v-text="str">div>
div>
<script type="text/javascript">
Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
new Vue({
el:'#root',
data:{
name:'张三',
str:'你好啊!
'
}
})
</script>
效果图:会替换掉节点中的内容,当有标签时,也看做文本内容直接显示。
v-html指令:
<div id="root">
<div>你好,{{name}}div>
<div v-html="str">div>
<div v-html="str2">div>
div>
<script type="text/javascript">
Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
new Vue({
el:'#root',
data:{
name:'张三',
str:'你好啊!
',
str2:'兄弟我找到你想要的资源了,快来!',
}
})
</script>
效果图:会替换掉节点中的内容,当内容中有标签时会解析成html结构渲染到页面。
v-cloak指令(没有值):
v-once指令:
v-pre指令:
<script type="text/javascript">
Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
new Vue({
el:'#root',
data:{
n:1
}
})
</script>
<div id="root">
<h2 v-pre>Vue其实很简单h2>
<h2 v-pre>当前的n值是:{{n}}h2>
<button @click="n++">点我n+1button>
div>
<div id="root">
<h2>Vue其实很简单h2>
<h2>当前的n值是:{{n}}h2>
<button @click="n++">点我n+1button>
div>
当将h2
中的v-pre
删除后,效果图为:
可以看到,在添加了v-pre
后,就会跳过改行:如若在没有使用指令语法、没有使用插值语法的节点,会加快编译。
自定义指令总结:
定义语法:
(1).局部指令:
new Vue({
directives:{指令名:配置对象}
})
或
new Vue({
directives{指令名:回调函数}
})
(2).全局指令:
Vue.directive(指令名,配置对象) 或 Vue.directive(指令名,回调函数)
配置对象中常用的3个回调:
(1).bind:指令与元素成功绑定时调用。
(2).inserted:指令所在元素被插入页面时调用。
(3).update:指令所在模板结构被重新解析时调用。
备注:
Vue.directive('fbind',function(element,binding){
element.value = binding.value
})
Vue.directive('fbind',{
//指令与元素成功绑定时(一上来)
bind(element,binding){
element.value = binding.value
},
//指令所在元素被插入页面时
inserted(element,binding){
element.focus()
},
//指令所在的模板被重新解析时
update(element,binding){
element.value = binding.value
}
})
注意:必须在new Vue实例之前定义全局指令
directives:{
//big函数何时会被调用?1.指令与元素成功绑定时(一上来)。2.指令所在的模板被重新解析时。
/* 'big-number'(element,binding){
// console.log('big')
element.innerText = binding.value * 10
}, */
big(element,binding){
console.log('big',this) //注意此处的this是window
// console.log('big')
element.innerText = binding.value * 10
},
}
directives:{
fbind:{
//指令与元素成功绑定时(一上来)
bind(element,binding){
element.value = binding.value
},
//指令所在元素被插入页面时
inserted(element,binding){
element.focus()
},
//指令所在的模板被重新解析时
update(element,binding){
element.value = binding.value
}
}
}
注意:directives与Vue实例中的data平级
常用的生命周期钩子:
关于销毁Vue实例