.html
<!--view层 ${} 变成了一个模板-->
<div id="app">
<ul>
<li><span v-bind:title="m">鼠标悬停几秒查看此处动态绑定的提示信息!</span> </li>
<li>{{name}}</li>
<li>{{tit.name}}</li>
</ul>
<a v-bind:href="tit.url">b站链接</a>
</div>
.script
var vm =new Vue({
el:"#app", //元素的缩写 el
data:{ //Model : 数据
m:'Hello vue!',
name:'Hello 框架',
tit:{
name:'Vue',
url:'https://www.bilibili.com'
}
}
});
事件的基本使用:
1.使用v-on:xxx 或 @xxx 绑定事件,其中xxx是事件名;
2.事件的回调需要配置在methods对象中,最终会在vm上
3.methods中配置的函数,不需要箭头函数,否则this就不是vm了;
4.methods中配置的函数,都是被vue所管理的函数,this指向的是vm 或者 组件实例对象;
5.@click="demo" 和 @click="($event)"效果一致,但后者可以传参
==============================================================================
<div id="root">
<button v-on:click="fn1()">点我提示信息1(不传参)</button>
<button v-on:click="fn2($event,66)">点我提示信息2(传参)</button>
</div>
==============================================================================
methods:{
fn1(event){
},
fn2(event,number) {
console.log(event,number)
//console.log(event.target.innerText)
//console.log(this)//此处的this是vm
alert('同学你好');
}
}
Vue中的事件修饰
1. prevent : 阻止事件的默认行为 event.preventDefault() 常用
2. stop : 停止事件冒泡 event.stopPropagation() 常用
3. once : 事件只触发一次(常用)
==============================================================================
<!--阻止默认事件-->
<a href="http://www.baidu.com" @click.prevent="showInfo">点击我提示信息</a>
<!--阻止冒泡事件-->
<div class="demo1" @click="showInfo">
<button @click.stop="showInfo()">点击我提示信息</button>
</div>
<!--事件只触发一次(常用)-->
<button @click.once="showInfo">点击我提示信息</button>
==============================================================================
methods:{
showInfo(e){
// e.preventDefault();//阻止默认事件
// e.stopPropagation();//阻止冒泡
//e.onceProcessed(); //事件只触发一次
alert('同学你好');
}
}
<!-- 键盘事件
1. keyup : 键盘弹起
2. keydown : 按下键盘
-->
因为methods没有缓存,所以只能反复调用,不建议使用这种方式
一、计算属性:
1.定义:要用的属性不存在,要通过已有属性计算得来。
2.原理:底层借助了Objcet.defineproperty方法提供的getter和setter.
3. get函数什么时候执行?
(1).初次读取时会执行一次。
(2).当依赖的数据发生改变时会被再次调用。
4.优势:与methods实现相比, 内部有缓存机制(复用),效爷更高,调试方便。
5.备注:
(1).计算属性最终会出现在vm上,直接读取使用即可。
(2).如果计算属性要被修改,那必须写set函数去响应修改,且set中 要引起计算时依赖的数据发生改变
<!--准备好一个容器-->
<div id="root">
姓:<input type="text" v-model="firstName"><br/>
名:<input type="text" v-model="lastName"><br/>
测试:<input type="text" v-model="x"><br/>
全名:<span>{{fullName}}</span><br/> <!--这里get只调用了1次,因为computed有缓存,所以直接就给其他调用的赋值了-->
全名:<span>{{fullName}}</span><br/>
全名:<span>{{fullName}}</span><br/>
全名:<span>{{fullName}}</span>
</div>
const vm = new Vue({
el:'#root',
data:{
firstName:'唐',
lastName:'九',
x:'你好'
},
computed:{//计算属性
fullName:{
//1.get有什么用?当有人在读取fullName时,get就会被调用,且返回值就作为,fullName的值
//2.get什么是被调用?1.有人初次使用fullName的时候。2.fullName依赖数据发生改变的时候。
get(){
console.log('get被调用')
//console.log(this);//此处的this是vm
return this.firstName+'-'+this.lastName
},
//set什么是被调用? 当fullName被修改时
set(value){
console.log('set',value)
let split = value.split('-');
this.firstName=split[0];
this.lastName=split[1]
}
}
二、data,methods,computed
data里面的属性,你写什么value,就是什么属性放在vm上
methods里面的方法,你写什么方法,就是什么方法放在vm上
computed里面,写的计算属性,他不是你写什么,vm上就放什么,
而是vm自动去找get的计算结果(返回值),放在vm身上了,
vm里面,放的计算结果的名字叫xxx
<!--准备好一个容器-->
<div id="root">
<h2 >今天天气很{{info}}</h2>
<button @click="btn">切换天气</button>
</div>
const vm = new Vue ({
el:'#root',
//添加属性,数据
data:{
isHot:true,
},
//计算属性
computed:{
info(){
return this.isHot?'炎热':'凉爽';
}
},
//方法,函数
methods:{
btn(){
this.isHot= !this.isHot;
}
},
//监视属性
watch:{
info:{
//handler 什么时候被调用?isHot发生改变的时候
handler(newValue,oldValue){
console.log("isHot 被修改了",newValue,oldValue)
},
//立即执行,函数
immediate:true, //初始化时,让handler,调用一下
}
}
})
深度监视:
(1)vue中的watch默认不检测对象内部值的改变(一层)。
(2)配置deep.true 可以监测对象内部值改变(多层)。
备注:
(1)vue自身可以监视对象内部值的改变,但是vue提供的watch默认不可以
(2)使用时watch根据数据的具体结构,决定是否采用深度监视。
==============================================================================
<!--准备好一个容器-->
<div id="root">
<h2 >a的值是:{{numbers.a}}</h2>
<button @click="numbers.a++">点我a+1</button>
</div>
==============================================================================
const vm = new Vue ({
el:'#root',
//添加属性,数据
data:{
numbers:{
a:1,
b:1,
}
},
//监视属性:一般默认,不提供多级化机构的监控
watch:{
info:{
//handler 什么时候被调用?isHot发生改变的时候
handler(newValue,oldValue){
console.log("isHot 被修改了",newValue,oldValue)
},
//立即执行,函数
immediate:true, //初始化时,让handler,调用一下
},
numbers:{
//深度监视,监视多级化结构中所有属性变化
deep:true,
handler() {
console.log("number改变了")
}
}
}
})
<!--准备好一个容器-->
<div id="root" >
<!--绑定class样式--字符串写法,适用于:样式的类名不确定,需要动态指定 -->
<div class="basic" :class="mood" @click="btn">{{name}}</div><br>
<!--绑定class样式--数组写法,适用于:要绑定的样式个数不确定,名字也不确定 -->
<div class="basic" :class="classArr">{{name}}</div><br>
<!--绑定class样式--对象写法,适用于:要绑定的样式个数确定,名字也确定,但要动态决定用不用 -->
<div class="basic" :class="classObj">{{name}}
</div>
==============================================================================
new Vue({
el:'#root',
data:{
name:'肉肉',
//字符串
mood:'normal',
//数组
classArr:['atguigu1','atguigu2','atguigu3'],
//对象
classObj:{
atguigu1:false,
atguigu2:false,
}
}
==============================================================================
<style>
.basic{
width: 400px;
height: 100px;
border: 1px solid black;
}
.happy{
background-color: #0093E9;
background-image: linear-gradient(160deg, #0093E9 0%, #80D0C7 100%);
}
.sad{
background-color: #D9AFD9;
background-image: linear-gradient(0deg, #D9AFD9 0%, #97D9E1 100%);
}
.normal{
background-color: #85FFBD;
background-image: linear-gradient(45deg, #85FFBD 0%, #FFFB7D 100%);
}
.atguigu1{
}
.atguigu2{
border-radius: 15px 50px 30px 5px
}
.atguigu3{
background-color: cornflowerblue;
}
</style>
1.使用v-show,做条件渲染
<h2 v-show="false">欢迎来到{{name}}</h2>
<h2 v-show="1===1">欢迎来到{{name}}</h2>
2.使用v-if做条件渲染
<h2 v-if="1===1">欢迎来到{{name}}</h2>
<h2 v-if="false">欢迎来到{{name}}</h2>
v-show不安全,在网页源码,可以看见,v-if看不见,所以安全!
但是频繁切换,最好使用show
频率低的用v-if
==============================================================================
<!--准备好一个容器-->
<div id="root">
<h2 >当前n值是{{n}}</h2>
<button @click="n++">点击+n</button>
<!--
<div v-show="n===1">Angular</div>
<div v-show="n===2">React</div>
<div v-show="n===3">Vue</div>
-->
<!-- v-else和v-else-if-->
<div v-if="n===1">Angular</div>
<div v-else-if="n===2">React</div>
<div v-else-if="n===3">Vue</div>
<div v-else>哈哈哈</div>
</div>
来源:3309064415