Vue笔记(入门)

Vue介绍

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。
在这里插入图片描述
所谓渐进式框架,就是把框架分层。
最核心的部分是是图层渲染,然后往外是组建机制,在这个基础上再加入路由机制,再加入状态管理,最外层是构建工具。

Vue基础

v-once

 v-once 只执行一次,后面没有表达式
<div id="app">
	<div>{{ message }}</div>
	<div v-once>{{ message}}</div>
</div>
<script>
const vm = new Vue({
	el: '#app',
	data:{
	message:'hello world'
	}
})
</script>

在console中改变vm.message的值,有v-once的不发生改变。效果如图:
在这里插入图片描述

v-html

 v-html  可以解析HTML标签
<div id="app">
	<div>{{ url }}</div>
	<div v-html="url"></div>
</div>
<script>
const vm = new Vue({
	el: '#app',
	data:{
		url:'<a href="https://www.baidu.com">百度一下</a>',
	}
})
</script>

效果如图:
在这里插入图片描述

v-text

  v-text  不想用{{大括号}}的时候,可以用v-text(一般不用),缺点是不够灵活。
<div id="app">
	<div>{{ message }}</div>
	<div v-text="message"></div>
</div>
<script>
const vm = new Vue({
	el: '#app',
	data:{
	message:'肖申克的救赎'
	}
})
</script>

效果如图:在这里插入图片描述

v-pre

  v-pre  类似于<pre>标签,当只想显示 {{ message }} ,而不想显示其内容的时候用
<div id="app">
	<div>{{ message }}</div>
	<div v-pre>{{message}}</div>
</div>
<script>
const vm = new Vue({
	el: '#app',
	data:{
	message:'肖申克的救赎'
	}
})
</script>

效果如图:在这里插入图片描述

v-cloak

   v-cloak  用得很少。
闪动(抖动),网络慢的时候,开始会显示 {{  msg  }} ,解析以后才显示其内容,
在div上加v-cloak,并设置[v-cloak] { display: none; }可以避免闪动
<div id="app">
	<div v-cloak>{{ message }}</div>
</div>
<script>
const vm = new Vue({
	el: '#app',
	data:{
	message:'肖申克的救赎'
	}
})
</script>

先把网络设置成3G的,再看效果,效果如图:在这里插入图片描述

v-bind

v-bind 动态绑定属性  ,可以简写成“:”,例如:<img v-bind:src="imgUrl" />可以简写成<img  :src="imgUrl" />
<div id="app">
	<img src="https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2775457732,1676441877&fm=11&gp=0.jpg"  />
	<img v-bind:src="imgUrl" />
	<img :src="imgUrl"/>
</div>
<script>
const vm = new Vue({
	el: '#app',
	data:{
		imgUrl:'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2775457732,1676441877&fm=11&gp=0.jpg',
	}
})
</script>

效果图如下:在这里插入图片描述

class  也可以用v-bind进行动态绑定,
		一个class可以用[className]来表示【注意:因为只有一个class,可以去掉[] 】,
		两个或多个就需要用[ className, className2 ]来表示
<style>
	.red{ color:red }
	.blue{ color:blue }
	.f20{ font-size:20px }
</style>
<div id="app">
	<p :class="[color1]">CSDN 专业开发者社区</p>
	<p :class="color1">CSDN 专业开发者社区</p>
	<p :class="[color2, fontSize]">CSDN 专业开发者社区</p>
	<p :class="[color2, {fontSize:false}]">CSDN 专业开发者社区</p>
</div>
<script>
const vm = new Vue({
	el: '#app',
	data:{
		color1: 'red',
		color2: 'blue',
		fontSize: 'f20',
	}
})
</script>

效果图如下:在这里插入图片描述

class  可以用在三目运算符中,例如上边的代码写成这样:
<p :class=" color1=='red' ? fontSize : ''  ">CSDN 专业开发者工具</p>
效果如下图:

在这里插入图片描述

style  也可以用v-bind进行动态绑定,
		一个内部样式可以写成{attribute属性: styleName}【注意:如果没有属性,只有一个内部样式,可以把{}去掉】,
		两个或者多个内部样式,就需要写成数组的样子了 { attribute: styleName,  attribute: styleName } 
<style>
	.red{ color:red }
	.blue{ color:blue }
	.f20{ font-size:20px }
</style>
<div id="app">
	<p :style="{color:color2}">CSDN 专业开发者社区</p>
	<p :style="red">CSDN 专业开发者社区</p>
	<p :style="{color:color2, fontSize:fontSize}">CSDN 专业开发者社区</p>
	<p :style="[pstyle,pstyle2]">CSDN 专业开发者社区</p>
</div>
<script>
const vm = new Vue({
	el: '#app',
	data:{
		red: 'color:red',
		color2: 'blue',
		fontSize: 'f20',
		pstyle: { width:'200px', border:'5px solid red'},
		pstyle2: { color:'red', fontSize:'20px'},
	}
})
</script>

效果图如下:在这里插入图片描述

v-if

v-if  控制dom的移除和添加
注意:v-if 和 v-else 中间不能加东西,加了以后,v-else就不起作用了
		v-if / v-else-if / v-else
		v-else-if 可以有,可以没有,可以写多个

v-show  控制dom的显示和隐藏
	但是v-show的隐藏是把 display的值设置成none,也就是渲染的时候是加载的,只是隐藏了,
	v-if的移除是移除这个元素,就是渲染的时候不加载,需要显示的时候,重新添加。
	所以,频繁使用显示和隐藏的时候,用v-show
注意:v-show 在template上不起作用,所以最好不要在template上写v-show

v-on

v-on:xxx  事件,简写“@” 
<style>
	.box{ width:100px; height:100px; }
	.bred{ background:red; }
	.bblue{ background:blue; }
</style>
<div id="app">
	<h4 :class="colors[index]">CSDN 专业开发者社区</h4>
	<div v-show="show" class="orange">是否展示这句话 CSDN 专业开发者社区</div>
	<template v-if="show">
		<div class="box bred"></div>
		<div class="box bblue"></div>
	</template>
	<button v-on:click="changecolor()">点击换颜色</button>
	<button @click="togglehide">{{txt}}</button>
</div>
<script>
const vm = new Vue({
	el: '#app',
	data:{
		colors: ['red' , 'yellow', 'orange', 'green', 'blue','purple'],
		index: 0,
		count: 0,
		txt: '隐藏',
		show: true,
	},
	// 在 methods 中使用 data 里面的数据的时候,要加 this 指向该Vue实例对象
	methods:{
		changecolor(){
			this.index = ++this.count % (this.colors.length);
		},
		togglehide(){
			if(this.show == true){ 
				this.show = false; 
				this.txt = "显示"; 
			} else {
				this.show = true; 
				this.txt = "隐藏";
			}
		},
	},
})
</script>

最开始的样子:在这里插入图片描述
每个按钮 点击一次 的样子:在这里插入图片描述
剩下的自己试一试吧

v-on 事件修饰符:
	.stop  阻止事件冒泡
	.self  只有当事件在该元素本身触发时才触发事件
	.capture 添加事件侦听器是,使用事件捕获模式
	.prevent  阻止默认行为,例如a标签的跳转默认行为
	.once 事件只触发一次
	.native  监听组件根元素的原生事件
	按键修饰符	
	按键别名:
		.enter
		.tab
		.delete (捕获 "删除" 和 "退格" 键)
		.esc
		.space
		.up
		.down
		.left
		.right
		.ctrl
		.alt
		.shift
		.meta
事件修饰符
.stop
<div id="app">
    <div class="outer" @click="outerClick">
      <div class="inner" @click="innerClick">
        <button @click.stop="btnClick">阻止事件冒泡</button>
      </div>
    </div>
</div>
<script>
const vm = new Vue({
    el: '#app',
    methods: {
        outerClick () {
          console.log("触发了outer点击事件")
        },
        innerClick () {
          console.log("触发了inner点击事件")
        },
        btnClick () {
          console.log("触发了按钮点击事件")
        },
    }
})
</script>

当点击按钮的时候,只触发按钮点击事件,阻止了事件冒泡(不触发 inner事件 和 outer事件)在这里插入图片描述

.self
<style>
	.outer{ width:500px; border:1px solid red; }
	.inner{ width:300px; border:1px solid blue; }
</style>
<div id="app">
    <div class="outer" @click="outerClick">
      <div class="inner" @click.self="innerClick">
        <button @click="btnClick">self效果</button>
      </div>
    </div>
</div>
<script>
const vm = new Vue({
    el: '#app',
    methods: {
        outerClick () {
          console.log("触发了outer点击事件")
        },
        innerClick () {
          console.log("触发了inner点击事件")
        },
        btnClick () {
          console.log("触发了按钮点击事件")
        },
    }
})
</script>

第一次点击按钮,第二次点击蓝色的框,不在按钮的位置点击,第三次点击红色的框,不在按钮的位置点击,也不再蓝框的位置点击,后台的结果如下图:在这里插入图片描述

.capture
<style>
	.outer{ width:500px; border:1px solid red; }
	.inner{ width:300px; border:1px solid blue; }
</style>
<div id="app">
    <div class="outer" @click="outerClick">
      <div class="inner" @click.capture="innerClick">
        <button @click="btnClick">self效果</button>
      </div>
    </div>
</div>
<script>
const vm = new Vue({
    el: '#app',
    methods: {
        outerClick () {
          console.log("触发了outer点击事件")
        },
        innerClick () {
          console.log("触发了inner点击事件")
        },
        btnClick () {
          console.log("触发了按钮点击事件")
        },
    }
})
</script>

当点击按钮的时候,会从外到里依次触发outer点击事件、inner点击事件、按钮点击事件
当点击inner div时,会从外到里依次触发outer点击事件、inner点击事件
当点击outer div时,只触发outer点击事件在这里插入图片描述

.prevent
<div id="app">
    <a href="http://www.baidu.com" @click.prevent="preventClick">百度一下 你就知道</a>
</div>
<script>
const vm = new Vue({
    el: '#app',
    methods: {
        preventClick () {
          console.log("阻止了a标签的默认点击跳转事件")
        },
    }
})
</script>

点击只会触发preventClick事件,不会跳转页面,阻止了a标签的默认跳转在这里插入图片描述

.once
<div id="app">
	<input type="button" value="只触发一次" @click.once="onceClick">
</div>
<script>
const vm = new Vue({
    el: '#app',
    methods: {
        onceClick () {
        	console.log("事件只触发一次,点击再多次按钮,也只输出一次")
        },
    }
})
</script>

once 顾名思义,就是只有一次,也就是点击再多次也不执行

按键修饰符
<div id="app">
	// Enter键触发submit事件  下面两种写法都对
    <input type="text" @keyup.enter="submit" />
    <input type="text" @keyup.13="submit" />
</div>
<script>
const vm = new Vue({
    el: '#app',
    methods: {
        submit() {
           console.log("enter键触发事件");
        }
    }
})
</script>
修饰符可以串联
<div id="app">
	<div class="outer" @click="outerClick">
        <div class="inner" @click="innerClick">
			<!-- 既阻止了默认事件,又阻止了事件冒泡 -->
    		<a href="http://www.baidu.com" @click.stop.prevent="btnClick">修饰符串联</a>
    	</div>
    </div>
</div>
<script>
const vm = new Vue({
    el: '#app',
    methods: {
        outerClick() {
           console.log("触发了outer点击事件")
        },
        innerClick() {
            console.log("触发了inner点击事件")
        },
        btnClick() {
            console.log("触发了按钮点击事件")
        },
    }
})
</script>

【注意】使用修饰符时,顺序很重要。相应的代码会以同样的顺序产生。

v-on:click.prevent.self //会阻止所有的点击的默认事件
v-on:click.self.prevent //只会阻止元素自身点击的默认事件

v-model

v-model  双向数据绑定(只用于表单元素)
	常见的表单元素包括:input(radio,text,address,email...)、select、checkbox、textarea
	v-bind:只能实现数据的单向绑定,从M绑定到V
	v-model:可以实现双向绑定
<div id="app">
	<input type="text" v-model="value"/><span>{{value}}</span>
	<p><input type="checkbox" v-model="checked"/>{{checked}}</p>
	<div>爱好 多选:
		<label for="sing"><input type="checkbox" id="sing" value="sing" v-model="checkedList" />sing</label>
		<label for="dance"><input type="checkbox" id="dance" value="dance" v-model="checkedList" />dance</label>
		<label for="read"><input type="checkbox" id="read" value="read" v-model="checkedList" />read</label>
		<p>{{checkedList}}</p>
	</div>
	<div>爱好 单选:
		<label for="sing1"><input type="radio" id="sing1" value="sing" v-model="picked" />sing</label>
		<label for="dance1"><input type="radio" id="dance1" value="dance" v-model="picked" />dance</label>
		<label for="read1"><input type="radio" id="read1" value="read" v-model="picked" />read</label>
		<p>{{picked}}</p>
	</div>
	<select name="" id="" v-model="selected" multiple>
		<option value="" disabled>请选择</option>
		<option value="sing2">sing2</option>
		<option value="dance2">dance2</option>
		<option value="read2">read2</option>
	</select>
	<p>select选择的是:{{selected}}</p>
</div>
<script>
const vm = new Vue({
    el: '#app',
    data:{
    	value:'杉杉',
    	checked:true,
    	checkedList:[],
		picked:'',
		selected:[],
    },
})
</script>

效果如下图:在这里插入图片描述
做个简易计算器

<div id="app">
	<input type="text" v-model="input1"/>
	<select id="opt" name="opt" v-model="opt">
		<option value="+">+</option>
		<option value="-">-</option>
		<option value="*">*</option>
		<option value="/">/</option>
	</select>
	<input type="text" v-model="input2"/>
	<button @click="jisuan"> = </button>
	<span>{{result2}}</span>
</div>
<script>
const vm = new Vue({
    el: '#app',
    data:{
		input1: 0,
		input2: 0,
		opt: '+',
		result2: 0
	},
    methods: {
        jisuan(){
			this.result2 = eval( 'parseFloat(this.input1)' + this.opt + 'parseFloat(this.input2)' )
		},
    }
})
</script>

渲染出来以后,将第一个input框输入5,计算符号选择 * ,第二个input 框输入6 ,点击“=”,结果会自动显示出来在这里插入图片描述

v-for

v-for   循环,循环数组,循环对象,循环数字,循环字符串
		v-for 要给key值,必须是数字类型或者string,必须是唯一的。
		不用key值的话,未来脚手架搭建项目时会报警告。key可以提升页面的性能。
		不建议用index下标作为key的值,因为下标会因为重新排序而从新排序,内部会做更改dom的操作,浪费性能
		
		1、不能通过索引的方式去更改数组,这样不会渲染
		2、不能通过更改长度的方式去更改数组,这样不会渲染
		3、数组变异方法(更改数组)只要执行这七个方法,就会进行渲染:
			pop、shift、unshift、splice、sort、reverse、push
<div id="app">
	<div v-for="(n,index) in m" :key="n">{{index}}--{{n}}</div>
	<div v-for="(value, key) in obj" >{{key}} : {{value}}</div>
	<div v-for="(num,indexs) in 10">{{indexs}} -- {{num}}</div>
	<div v-for="item in 'CSDN' ">{{item}}</div>
	<button @click="handleclick">第一组数组重新排序 reverse 回改变原数组</button>
</div>
<script>
const vm = new Vue({
	el:'#app',
	data:{
		m:['html','css','js','ajax'],
		obj:{'name':'shanshan','age':18,'heihgt':170},
	},
	methods:{
		handleclick(){
			this.m.reverse();
		},
	},
})
</script>

渲染出来以后的效果如下:在这里插入图片描述
点击按钮一次 的效果如下:在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值