VUE入门到精通(一):基础知识

# VUE

vue.js是开发环境版本,包含完整的警告和调试模式;而vue.min.js”是生产环境版本,删除了警告。 2、vue.js是完整的未压缩的版本,文件比较大;而vue.min.js是经过压缩的版本,减小了文件体积。

一、初始VUE

Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示

DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8" />
	<title>初识Vuetitle>
	
	<script type="text/javascript" src="../js/vue.js">script>
head>

<body>
	

	
	<div id="demo">
		<h1>Hello,{{name.toUpperCase()}},{{address}}h1>
	div>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		//创建Vue实例
		new Vue({
			el: '#demo', //el用于指定当前Vue实例为哪个容器服务,值通常为css选择器字符串,此处为id选择器 ==	document.getElementById("demo")
			data: { //data中用于存储数据,数据供el所指定的容器去使用,data的值我们暂时先写成一个对象。
				name: 'atguigu',
				address: '北京'
			}
		})
	script>
body>

html>

二、模板语法

DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8" />
	<title>模板语法title>
	
	<script type="text/javascript" src="../js/vue.js">script>
head>

<body>
	
	
	<div id="root">
		<h1>插值语法h1>
		<h3>你好,{{name}}h3>
		<hr />
		<h1>指令语法h1>
		<a v-bind:href="school.url.toUpperCase()" x="hello">点我去{{school.name}}学习1a>
		<a :href="school.url" x="hello">点我去{{school.name}}学习2a>
		
	div>
body>

<script type="text/javascript">
	Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

	new Vue({
		el: '#root',
		data: {
			name: 'jack',
			school: {
				name: '尚硅谷',
				url: 'http://www.atguigu.com',
			}
		}
	})
script>

html>

三、数据绑定

DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8" />
	<title>数据绑定title>
	
	<script type="text/javascript" src="../js/vue.js">script>
head>

<body>
	
	
	<div id="root">
		
		

		
		单向数据绑定:<input type="text" :value="name"><br />
		双向数据绑定:<input type="text" v-model="name"><br />

		
		
	div>
body>

<script type="text/javascript">
	Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

	new Vue({
		el: '#root',
		data: {
			name: '尚硅谷'
		}
	})
script>

html>

四、el、data两种写法

DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8" />
	<title>el与data的两种写法title>
	
	<script type="text/javascript" src="../js/vue.js">script>
head>

<body>
	
	
	<div id="root">
		<h1>你好,{{name}}h1>
	div>
body>

<script type="text/javascript">
	Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

	//1、el的两种写法
	/* const v = new Vue({
		//el:'#root', //第一种写法
		data:{
			name:'尚硅谷'
		}
	})
	console.log(v)
	v.$mount('#root') //第二种写法 更灵活*/

	//2、data的两种写法
	new Vue({
		el: '#root',
		//data的第一种写法:对象式
		/* data:{
			name:'尚硅谷'
		} */

		//data的第二种写法:函数式 
		data() {
			console.log('@@@', this) //此处的this是Vue实例对象
			return {
				// 函数必须返回对象,不可使用箭头函数,箭头函数this永远指向window
				name: '尚硅谷'
			}
		}
	})
script>

html>

五、MVVM模型

  1. M:模型(Model) :对应 data 中的数据

  2. V:视图(View) :模板

  3. VM:视图模型(ViewModel) : Vue 实例对象

VUE入门到精通(一):基础知识_第1张图片

示例代码

DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8" />
	<title>理解MVVMtitle>
	
	<script type="text/javascript" src="../js/vue.js">script>
head>

<body>
	
	
	
	<div id="root">
		<h1>学校名称:{{name}}h1>
		<h1>学校地址:{{address}}h1>
		
	div>
body>

<script type="text/javascript">
	Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

	//vm为 B、viewModel
	const vm = new Vue({
		el: '#root',
		data: { //C、data 为Model
			name: '尚硅谷',
			address: '北京',
		}
	})
	console.log(vm) //data中key/value 保存在vue实例中
script>

html>

六、VUE数据代理原理

1、关于Object.defineProperty()方法

	let number = 18
		let person = {
			name: '张三',
			sex: '男',
		}


		//此方法用于给指定对象添加属性
		//参数1、目标对象 2、属性名 3、属性描述对象
		Object.defineProperty(person, 'age', {
			// value:18,
			// enumerable:true, //控制属性是否可以枚举,默认值是false
			// writable:true, //控制属性是否可以被修改,默认值是false
			// configurable:true //控制属性是否可以被删除,默认值是false

			//当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
			get() {
				console.log('有人读取age属性了')
				return number
			},

			//当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的具体值
			set(value) {
				console.log('有人修改了age属性,且值是', value)
				number = value
			}

		})

		// console.log(Object.keys(person))

		console.log(person)

2、什么是数据代理

数据代理:通过一个对象代理对另一个对象中属性的操作(读/写)

		let obj = {x:100}
		let obj2 = {y:200}

			Object.defineProperty(obj2,'x',{
				get(){
					return obj.x
				},
				set(value){
					obj.x = value
				}
			})

3、Vue如何实现数据代理
VUE入门到精通(一):基础知识_第2张图片

DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8" />
	<title>Vue中的数据代理title>
	
	<script type="text/javascript" src="../js/vue.js">script>
head>

<body>
	
	
	<div id="root">
		<h2>学校名称:{{name}}h2>
		<h2>学校地址:{{address}}h2>
	div>
body>

<script type="text/javascript">
	Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

	const vm = new Vue({
		el: '#root',
		data: {
			name: '尚硅谷',
			address: '宏福科技园'
		}
	})
script>

html>	

七、事件处理

1、事件的基本使用

DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8" />
	<title>事件的基本使用title>
	
	<script type="text/javascript" src="../js/vue.js">script>
head>

<body>
	
	
	<div id="root">
		<h2>欢迎来到{{name}}学习h2>
		
		<button @click="showInfo1">点我提示信息1(不传参)button>
		<button @click="showInfo2($event,66)">点我提示信息2(传参)button>
	div>
body>

<script type="text/javascript">
	Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

	const vm = new Vue({
		el: '#root',
		data: {
			name: '尚硅谷',
		},
		methods: { //细节:函数可以声明data对象里,根据数据代理会在vm上产生函数的getter、setter,没有实际意义
			showInfo1(event) {
				// console.log(event.target.innerText)
				// console.log(this) //此处的this是vm
				alert('同学你好!')
			},
			showInfo2(event, number) {
				console.log(event, number)
				// console.log(event.target.innerText)
				// console.log(this) //此处的this是vm
				alert('同学你好!!')
			}
		}
	})
script>

html>

2、事件的修饰符

DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8" />
	<title>事件修饰符title>
	
	<script type="text/javascript" src="../js/vue.js">script>
	<style>
		* {
			margin-top: 20px;
		}

		.demo1 {
			height: 50px;
			background-color: skyblue;
		}

		.box1 {
			padding: 5px;
			background-color: skyblue;
		}

		.box2 {
			padding: 5px;
			background-color: orange;
		}

		.list {
			width: 200px;
			height: 200px;
			background-color: peru;
			overflow: auto;
		}

		li {
			height: 100px;
		}
	style>
head>

<body>
	
	
	<div id="root">
		<h2>欢迎来到{{name}}学习h2>

		
		<a href="http://www.atguigu.com" @click.prevent="showInfo">点我提示信息a>


		
		<div class="demo1" @click="showInfo">
			<button @click.stop="showInfo">点我提示信息button>
			
			
		div>


		
		<button @click.once="showInfo">点我提示信息button>

		
		<div class="box1" @click.capture="showMsg(1)">
			div1
			<div class="box2" @click="showMsg(2)">
				div2
			div>
		div>

		
		<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>

	div>
body>

<script type="text/javascript">
	Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

	new Vue({
		el: '#root',
		data: {
			name: '尚硅谷'
		},
		methods: {
			showInfo(e) {
				alert('同学你好!')
				// console.log(e.target)
			},
			showMsg(msg) {
				console.log(msg)
			},
			demo() {
				for (let i = 0; i < 100000; i++) {
					console.log('#')
				}
				console.log('累坏了')
			}
		}
	})
script>

html>

3、键盘事件

DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8" />
	<title>键盘事件title>
	
	<script type="text/javascript" src="../js/vue.js">script>
head>

<body>
	
	
	<div id="root">
		<h2>欢迎来到{{name}}学习h2>
		<input type="text" placeholder="按下回车提示输入" @keydown.huiche="showInfo">
	div>
body>

<script type="text/javascript">
	Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
	Vue.config.keyCodes.huiche = 13 //定义了一个别名按键

	new Vue({
		el: '#root',
		data: {
			name: '尚硅谷'
		},
		methods: {
			showInfo(e) {
				// console.log(e.key,e.keyCode)
				console.log(e.target.value)
			}
		},
	})
script>

html>

八、计算属性

1、计算属性实现

DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8" />
	<title>姓名案例_计算属性实现title>
	
	<script type="text/javascript" src="../js/vue.js">script>
head>

<body>
	
	
	<div id="root">
		姓:<input type="text" v-model="firstName"> <br /><br />
		名:<input type="text" v-model="lastName"> <br /><br />
		测试:<input type="text" v-model="x"> <br /><br />
		全名:<span>{{fullName}}span> <br /><br />
		
	div>
body>

<script type="text/javascript">
	Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

	const vm = new Vue({
		el: '#root',
		data: {
			firstName: '张',
			lastName: '三',
			x: '你好'
		},
		methods: {
			demo() {

			}
		},
		computed: {
			fullName: {
				//get有什么作用?当有人读取fullName时,get就会被调用,且返回值就作为fullName的值
				//get什么时候调用?1.初次读取fullName时。2.所依赖的数据发生变化时。
				get() {
					console.log('get被调用了')
					// console.log(this) //此处的this是vm
					return this.firstName + '-' + this.lastName
				},
				//set什么时候调用? 当fullName被修改时。
				set(value) {
					console.log('set', value)
					const arr = value.split('-')
					this.firstName = arr[0]
					this.lastName = arr[1]
				}


				//  更多情况计算属性只读取不改变
				//简写   只考虑读取才能简写
				// fullName(){
				// 	console.log('get被调用了')
				// 	return this.firstName + '-' + this.lastName
				// }
			}
		}
	})
script>

html>

九、监视属性

1、监视属性语法

DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8" />
	<title>天气案例_监视属性title>
	
	<script type="text/javascript" src="../js/vue.js">script>
head>

<body>
	
	
	<div id="root">
		<h2>今天天气很{{info}}h2>
		<button @click="changeWeather">切换天气button>
	div>
body>

<script type="text/javascript">
	Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

	const vm = new Vue({
		el: '#root',
		data: {
			isHot: true,
		},
		computed: {
			info() {
				return this.isHot ? '炎热' : '凉爽'
			}
		},
		methods: {
			changeWeather() {
				this.isHot = !this.isHot
			}
		},
		/* watch:{
			isHot:{
				immediate:true, //初始化时让handler调用一下
				//handler什么时候调用?当isHot发生改变时。
				handler(newValue,oldValue){
					console.log('isHot被修改了',newValue,oldValue)
				}
			}
		} */
	})

	vm.$watch('isHot', {
		immediate: true, //初始化时让handler调用一下
		//handler什么时候调用?当isHot发生改变时。
		handler(newValue, oldValue) {
			console.log('isHot被修改了', newValue, oldValue)
		}
	})
script>

html>

2、深度监视实现

	DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8" />
	<title>天气案例_深度监视title>
	
	<script type="text/javascript" src="../js/vue.js">script>
head>

<body>
	
	
	<div id="root">
		<h2>今天天气很{{info}}h2>
		<button @click="changeWeather">切换天气button>
		<hr />
		<h3>a的值是:{{numbers.a}}h3>
		<button @click="numbers.a++">点我让a+1button>
		<h3>b的值是:{{numbers.b}}h3>
		<button @click="numbers.b++">点我让b+1button>
		<button @click="numbers = {a:666,b:888}">彻底替换掉numbersbutton>
		{{numbers.c.d.e}}
	div>
body>

<script type="text/javascript">
	Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

	const vm = new Vue({
		el: '#root',
		data: {
			isHot: true,
			numbers: {
				a: 1,
				b: 1,
				c: {
					d: {
						e: 100
					}
				}
			}
		},
		computed: {
			info() {
				return this.isHot ? '炎热' : '凉爽'
			}
		},
		methods: {
			changeWeather() {
				this.isHot = !this.isHot
			}
		},
		watch: {
			isHot: {
				// immediate:true, //初始化时让handler调用一下
				//handler什么时候调用?当isHot发生改变时。
				handler(newValue, oldValue) {
					console.log('isHot被修改了', newValue, oldValue)
				}
			},
			//监视多级结构中某个属性的变化
			/* 'numbers.a':{
				handler(){
					console.log('a被改变了')
				}
			} */
			//监视多级结构中所有属性的变化
			numbers: {
				deep: true,
				handler() {
					console.log('numbers改变了')
				}
			}
		}
	})
script>

html>

3、监视属性简写

DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8" />
	<title>天气案例_监视属性_简写title>
	
	<script type="text/javascript" src="../js/vue.js">script>
head>

<body>
	
	<div id="root">
		<h2>今天天气很{{info}}h2>
		<button @click="changeWeather">切换天气button>
	div>
body>

<script type="text/javascript">
	Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

	const vm = new Vue({
		el: '#root',
		data: {
			isHot: true,
		},
		computed: {
			info() {
				return this.isHot ? '炎热' : '凉爽'
			}
		},
		methods: {
			changeWeather() {
				this.isHot = !this.isHot
			}
		},
		watch: {
			//正常写法
			/* isHot:{
				// immediate:true, //初始化时让handler调用一下
				// deep:true,//深度监视
				handler(newValue,oldValue){
					console.log('isHot被修改了',newValue,oldValue)
				}
			}, */

			//简写  
			//只使用handler的情况
			/* isHot(newValue,oldValue){
				console.log('isHot被修改了',newValue,oldValue,this)
			} */
		}
	})

	//正常写法
	/* vm.$watch('isHot',{
		immediate:true, //初始化时让handler调用一下
		deep:true,//深度监视
		handler(newValue,oldValue){
			console.log('isHot被修改了',newValue,oldValue)
		}
	}) */

	//简写 
	//只使用handler时
	/* vm.$watch('isHot',function(newValue,oldValue){
		console.log('isHot被修改了',newValue,oldValue)
	}) */
script>

html>

4、computed和watch之间的区别

DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8" />
	<title>姓名案例_watch实现title>
	
	<script type="text/javascript" src="../js/vue.js">script>
head>

<body>
	
	
	<div id="root">
		姓:<input type="text" v-model="firstName"> <br /><br />
		名:<input type="text" v-model="lastName"> <br /><br />
		全名:<span>{{fullName}}span> <br /><br />
	div>
body>

<script type="text/javascript">
	Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

	const vm = new Vue({
		el: '#root',
		data: {
			firstName: '张',
			lastName: '三',
			fullName: '张-三'
		},
		watch: {
			firstName(val) {
				//坑:setTimeout(定时任务)回调函数是由windos对象调用,若写成普通函数,则this会指向window,
				//this指向不对,所以此处应写成箭头函数(看备注)
				setTimeout(() => {
					console.log(this)
					this.fullName = val + '-' + this.lastName
				}, 1000);
			},
			lastName(val) {
				this.fullName = this.firstName + '-' + val
			}
		}
	})
script>

html>

十、样式绑定

DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8" />
	<title>绑定样式title>
	<style>
		/* 黑框长方形 */
		.basic {
			width: 400px;
			height: 100px;
			border: 1px solid black;
		}

		.happy {
			border: 4px solid red;
			;
			background-color: rgba(255, 255, 0, 0.644);
			background: linear-gradient(30deg, yellow, pink, orange, yellow);
		}

		.sad {
			border: 4px dashed rgb(2, 197, 2);
			background-color: gray;
		}

		.normal {
			background-color: skyblue;
		}

		.atguigu1 {
			background-color: yellowgreen;
		}

		.atguigu2 {
			font-size: 30px;
			text-shadow: 2px 2px 10px red;
		}

		.atguigu3 {
			border-radius: 20px;
		}
	style>
	<script type="text/javascript" src="../js/vue.js">script>
head>

<body>
	
	
	<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 class="basic" :style="styleObj">{{name}}div> <br /><br />
		
		<div class="basic" :style="styleArr">{{name}}div>
	div>
body>

<script type="text/javascript">
	Vue.config.productionTip = false

	const vm = new Vue({
		el: '#root',
		data: {
			name: '尚硅谷',
			mood: 'normal',
			classArr: ['atguigu1', 'atguigu2', 'atguigu3'],
			classObj: {
				atguigu1: false,
				atguigu2: false,
			},
			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>

html>	

十一、条件渲染

DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8" />
	<title>条件渲染title>
	<script type="text/javascript" src="../js/vue.js">script>
head>

<body>
	
	
	<div id="root">
		<h2>当前的n值是:{{n}}h2>
		<button @click="n++">点我n+1button>
		
		
		

		
		
		

		
		

		
		
		<template v-if="n === 1">
			<h2>你好h2>
			<h2>尚硅谷h2>
			<h2>北京h2>
		template>

	div>
body>

<script type="text/javascript">
	Vue.config.productionTip = false

	const vm = new Vue({
		el: '#root',
		data: {
			name: '尚硅谷',
			n: 0
		}
	})
script>

html>

十二、列表渲染

1、基本列表渲染

DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>基本列表title>
		<script type="text/javascript" src="../js/vue.js">script>
	head>
	<body>
		
		
		<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>
html>

2、key原理

DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>key的原理title>
		<script type="text/javascript" src="../js/vue.js">script>
	head>
	<body>
		
		
		<div id="root">
			
			<h2>人员列表(遍历数组)h2>
			<button @click.once="add">添加一个老刘button>
			<ul>
				<li v-for="(p,index) of persons" :key="index">
					{{p.name}}-{{p.age}}
					<input type="text">
				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}
					]
				},
				methods: {
					add(){
						const p = {id:'004',name:'老刘',age:40}
						this.persons.unshift(p)
					}
				},
			})
		script>
html>

3、列表过滤

DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>列表过滤title>
		<script type="text/javascript" src="../js/vue.js">script>
	head>
	<body>
		
		<div id="root">
			<h2>人员列表h2>
			<input type="text" placeholder="请输入名字" v-model="keyWord">
			<ul>
				<li v-for="(p,index) of filPerons" :key="index">
					{{p.name}}-{{p.age}}-{{p.sex}}
				li>
			ul>
		div>

		<script type="text/javascript">
			Vue.config.productionTip = false
			
			//用watch实现
			//#region 
			/* new Vue({
				el:'#root',
				data:{
					keyWord:'',
					persons:[
						{id:'001',name:'马冬梅',age:19,sex:'女'},
						{id:'002',name:'周冬雨',age:20,sex:'女'},
						{id:'003',name:'周杰伦',age:21,sex:'男'},
						{id:'004',name:'温兆伦',age:22,sex:'男'}
					],
					filPerons:[]
				},
				watch:{
					keyWord:{
						immediate:true,
						handler(val){
							this.filPerons = this.persons.filter((p)=>{
								return p.name.indexOf(val) !== -1
							})
						}
					}
				}
			}) */
			//#endregion
			
			//用computed实现
			new Vue({
				el:'#root',
				data:{
					keyWord:'',
					persons:[
						{id:'001',name:'马冬梅',age:19,sex:'女'},
						{id:'002',name:'周冬雨',age:20,sex:'女'},
						{id:'003',name:'周杰伦',age:21,sex:'男'},
						{id:'004',name:'温兆伦',age:22,sex:'男'}
					]
				},
				computed:{
					filPerons(){
						return this.persons.filter((p)=>{
							return p.name.indexOf(this.keyWord) !== -1
						})
					}
				}
			}) 
		script>
html>

4、列表排序

DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8" />
	<title>列表排序title>
	<script type="text/javascript" src="../js/vue.js">script>
head>

<body>
	
	<div id="root">
		<h2>人员列表h2>
		<input type="text" placeholder="请输入名字" v-model="keyWord">
		<button @click="sortType = 2">年龄升序button>
		<button @click="sortType = 1">年龄降序button>
		<button @click="sortType = 0">原顺序button>
		<ul>
			<li v-for="(p,index) of filPerons" :key="p.id">
				{{p.name}}-{{p.age}}-{{p.sex}}
				<input type="text">
			li>
		ul>
	div>

	<script type="text/javascript">
		Vue.config.productionTip = false

		new Vue({
			el: '#root',
			data: {
				keyWord: '',
				sortType: 0, //0原顺序 1降序 2升序
				persons: [{
						id: '001',
						name: '马冬梅',
						age: 30,
						sex: '女'
					},
					{
						id: '002',
						name: '周冬雨',
						age: 31,
						sex: '女'
					},
					{
						id: '003',
						name: '周杰伦',
						age: 18,
						sex: '男'
					},
					{
						id: '004',
						name: '温兆伦',
						age: 19,
						sex: '男'
					}
				]
			},
			computed: {
				filPerons() {
					const arr = this.persons.filter((p) => {
						return p.name.indexOf(this.keyWord) !== -1
					})
					//判断一下是否需要排序
					if (this.sortType) {
						arr.sort((p1, p2) => {
							return this.sortType === 1 ? p2.age - p1.age : p1.age - p2.age
						})
					}
					return arr
				}
			}
		})
	script>

html>

5、Vue检测数据改变原理

引发思考

DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8" />
	<title>更新时的一个问题title>
	<script type="text/javascript" src="../js/vue.js">script>
head>

<body>
	
	<div id="root">
		<h2>人员列表h2>
		
		<button @click="updateMei">更新马冬梅的信息button>
		<ul>
			<li v-for="(p,index) of persons" :key="p.id">
				{{p.name}}-{{p.age}}-{{p.sex}}
			li>
		ul>
	div>

	<script type="text/javascript">
		Vue.config.productionTip = false

		const vm = new Vue({
			el: '#root',
			data: {
				persons: [{
						id: '001',
						name: '马冬梅',
						age: 30,
						sex: '女'
					},
					{
						id: '002',
						name: '周冬雨',
						age: 31,
						sex: '女'
					},
					{
						id: '003',
						name: '周杰伦',
						age: 18,
						sex: '男'
					},
					{
						id: '004',
						name: '温兆伦',
						age: 19,
						sex: '男'
					}
				]
			},
			methods: {
				updateMei() {
					// this.persons[0].name = '马老师' //奏效
					// this.persons[0].age = 50 //奏效
					// this.persons[0].sex = '男' //奏效
					// this.persons[0] = {id:'001',name:'马老师',age:50,sex:'男'} //不奏效
					this.persons.splice(0, 1, {
						id: '001',
						name: '马老师',
						age: 50,
						sex: '男'
					})
				}
			}
		})
	script>

html>

原理总结

DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8" />
	<title>总结数据监视title>
	<style>
		button {
			margin-top: 10px;
		}
	style>
	
	<script type="text/javascript" src="../js/vue.js">script>
head>

<body>
	
	
	<div id="root">
		<h1>学生信息h1>
		<button @click="student.age++">年龄+1岁button> <br />
		<button @click="addSex">添加性别属性,默认值:男button> <br />
		<button @click="student.sex = '未知' ">修改性别button> <br />
		<button @click="addFriend">在列表首位添加一个朋友button> <br />
		<button @click="updateFirstFriendName">修改第一个朋友的名字为:张三button> <br />
		<button @click="addHobby">添加一个爱好button> <br />
		<button @click="updateHobby">修改第一个爱好为:开车button> <br />
		<button @click="removeSmoke">过滤掉爱好中的抽烟button> <br />
		<h3>姓名:{{student.name}}h3>
		<h3>年龄:{{student.age}}h3>
		<h3 v-if="student.sex">性别:{{student.sex}}h3>
		<h3>爱好:h3>
		<ul>
			<li v-for="(h,index) in student.hobby" :key="index">
				{{h}}
			li>
		ul>
		<h3>朋友们:h3>
		<ul>
			<li v-for="(f,index) in student.friends" :key="index">
				{{f.name}}--{{f.age}}
			li>
		ul>
	div>
body>

<script type="text/javascript">
	Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

	const vm = new Vue({
		el: '#root',
		data: {
			student: {
				name: 'tom',
				age: 18,
				hobby: ['抽烟', '喝酒', '烫头'],
				friends: [{
						name: 'jerry',
						age: 35
					},
					{
						name: 'tony',
						age: 36
					}
				]
			}
		},
		methods: {
			addSex() {
				// Vue.set(this.student,'sex','男')
				this.$set(this.student, 'sex', '男')
			},
			addFriend() {
				this.student.friends.unshift({
					name: 'jack',
					age: 70
				})
			},
			updateFirstFriendName() {
				this.student.friends[0].name = '张三'
			},
			addHobby() {
				this.student.hobby.push('学习')
			},
			updateHobby() {
				// this.student.hobby.splice(0,1,'开车')
				// Vue.set(this.student.hobby,0,'开车')
				this.$set(this.student.hobby, 0, '开车')
			},
			removeSmoke() {
				this.student.hobby = this.student.hobby.filter((h) => {
					return h !== '抽烟'
				})
			}
		}
	})
script>

html>

十三、收集表单数据

DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>收集表单数据title>
		<script type="text/javascript" src="../js/vue.js">script>
	head>
	<body>
		
		
		<div id="root">
			<form @submit.prevent="demo">
				账号:<input type="text" v-model.trim="userInfo.account"> <br/><br/>
				密码:<input type="password" v-model="userInfo.password"> <br/><br/>
				年龄:<input type="number" v-model.number="userInfo.age"> <br/><br/>
				性别:
				男<input type="radio" name="sex" v-model="userInfo.sex" value="male"><input type="radio" name="sex" v-model="userInfo.sex" value="female"> <br/><br/>
				爱好:
				学习<input type="checkbox" v-model="userInfo.hobby" value="study">
				打游戏<input type="checkbox" v-model="userInfo.hobby" value="game">
				吃饭<input type="checkbox" v-model="userInfo.hobby" value="eat">
				<br/><br/>
				所属校区
				<select v-model="userInfo.city">
					<option value="">请选择校区option>
					<option value="beijing">北京option>
					<option value="shanghai">上海option>
					<option value="shenzhen">深圳option>
					<option value="wuhan">武汉option>
				select>
				<br/><br/>
				其他信息:
				<textarea v-model.lazy="userInfo.other">textarea> <br/><br/>
				<input type="checkbox" v-model="userInfo.agree">阅读并接受<a href="http://www.atguigu.com">《用户协议》a>
				<button>提交button>
			form>
		div>
	body>

	<script type="text/javascript">
		Vue.config.productionTip = false

		new Vue({
			el:'#root',
			data:{
				userInfo:{
					account:'',
					password:'',
					age:18,
					sex:'female',
					hobby:[],
					city:'beijing',
					other:'',
					agree:''
				}
			},
			methods: {
				demo(){
					console.log(JSON.stringify(this.userInfo))
				}
			}
		})
	script>
html>

十四、过滤器

案例:显示格式化后的时间戳

第三方类库:day.js

DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>过滤器title>
		<script type="text/javascript" src="../js/vue.js">script>
		<script type="text/javascript" src="../js/dayjs.min.js">script>
	head>
	<body>
		
		
		<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>
	body>

	<script type="text/javascript">
		Vue.config.productionTip = false
		//全局过滤器
		Vue.filter('mySlice',function(value){
			return value.slice(0,4)
		})
		
		new Vue({
			el:'#root',
			data:{
				time:1621561377603, //时间戳
				msg:'你好,尚硅谷'
			},
			computed: {
				fmtTime(){
					return dayjs(this.time).format('YYYY年MM月DD日 HH:mm:ss')
				}
			},
			methods: {
				getFmtTime(){
					return dayjs(this.time).format('YYYY年MM月DD日 HH:mm:ss')
				}
			},
			//局部过滤器
			filters:{
				timeFormater(value,str='YYYY年MM月DD日 HH:mm:ss'){
					// console.log('@',value)
					return dayjs(value).format(str)
				}
			}
		})

		new Vue({
			el:'#root2',
			data:{
				msg:'hello,atguigu!'
			}
		})
	script>
html>

十五、内置指令

1、v-text

DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>v-text指令title>
		
		<script type="text/javascript" src="../js/vue.js">script>
	head>
	<body>
		
		
		<div id="root">
			<div>你好,{{name}}div>
			<div v-text="name">div>
			<div v-text="str">div>
		div>
	body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
		
		new Vue({
			el:'#root',
			data:{
				name:'尚硅谷',
				str:'

你好啊!

'
} })
script> html>

2、v-html

DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>v-html指令title>
		
		<script type="text/javascript" src="../js/vue.js">script>
	head>
	<body>
		
		
		<div id="root">
			<div>你好,{{name}}div>
			<div v-html="str">div>
			<div v-html="str2">div>
		div>
	body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		new Vue({
			el:'#root',
			data:{
				name:'尚硅谷',
				str:'

你好啊!

'
, str2:'兄弟我找到你想要的资源了,快来!', } })
script> html>

3、v-cloak指令

DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>v-cloak指令title>
		<style>
			[v-cloak]{
				display:none;
			}
		style>
		
	head>
	<body>
		
		
		<div id="root">
			<h2 v-cloak>{{name}}h2>
		div>
		<script type="text/javascript" src="http://localhost:8080/resource/5s/vue.js">script>
	body>
	
	<script type="text/javascript">
		console.log(1)
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
		
		new Vue({
			el:'#root',
			data:{
				name:'尚硅谷'
			}
		})
	script>
html>

4、v-once_指令

DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>v-once指令title>
		
		<script type="text/javascript" src="../js/vue.js">script>
	head>
	<body>
		
		
		<div id="root">
			<h2 v-once>初始化的n值是:{{n}}h2>
			<h2>当前的n值是:{{n}}h2>
			<button @click="n++">点我n+1button>
		div>
	body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
		
		new Vue({
			el:'#root',
			data:{
				n:1
			}
		})
	script>
html>

5、v-pre_指令

DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>v-pre指令title>
		
		<script type="text/javascript" src="../js/vue.js">script>
	head>
	<body>
		
		
		<div id="root">
			<h2 v-pre>Vue其实很简单h2>
			<h2 >当前的n值是:{{n}}h2>
			<button @click="n++">点我n+1button>
		div>
	body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		new Vue({
			el:'#root',
			data:{
				n:1
			}
		})
	script>
html>

十六、自定义指令

1、对象式:功能完善

2、函数式:书写简单

DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>自定义指令title>
		<script type="text/javascript" src="../js/vue.js">script>
	head>
	<body>
		
		
		<div id="root">
			<h2>{{name}}h2>
			<h2>当前的n值是:<span v-text="n">span> h2>
			
			<h2>放大10倍后的n值是:<span v-big="n">span> h2>
			<button @click="n++">点我n+1button>
			<hr/>
			<input type="text" v-fbind:value="n">
		div>
	body>
	
	<script type="text/javascript">
		Vue.config.productionTip = false

		//定义全局指令
		/* Vue.directive('fbind',{
			//指令与元素成功绑定时(一上来)
			bind(element,binding){
				element.value = binding.value
			},
			//指令所在元素被插入页面时
			inserted(element,binding){
				element.focus()
			},
			//指令所在的模板被重新解析时
			update(element,binding){
				element.value = binding.value
			}
		}) */

		new Vue({
			el:'#root',
			data:{
				name:'尚硅谷',
				n:1
			},
			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
				},
				fbind:{
					//指令与元素成功绑定时(一上来)
					bind(element,binding){
						element.value = binding.value
					},
					//指令所在元素被插入页面时
					inserted(element,binding){
						element.focus()
					},
					//指令所在的模板被重新解析时
					update(element,binding){
						element.value = binding.value
					}
				}
			}
		})
		
	script>
html>

十七、vue生命周期

VUE入门到精通(一):基础知识_第3张图片

1、各个生命周期

DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>分析生命周期title>
		
		<script type="text/javascript" src="../js/vue.js">script>
	head>
	<body>
		
		<div id="root" :x="n">
			<h2 v-text="n">h2>
			<h2>当前的n值是:{{n}}h2>
			<button @click="add">点我n+1button>
			<button @click="bye">点我销毁vmbutton>
		div>
	body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		new Vue({
			el:'#root',
			// template:`
			// 	
//

当前的n值是:{{n}}

// //
// `, data:{ n:1 }, methods: { add(){ console.log('add') this.n++ }, bye(){ console.log('bye') this.$destroy() } }, watch:{ n(){ console.log('n变了') } }, beforeCreate() { console.log('beforeCreate') }, created() { console.log('created') }, beforeMount() { console.log('beforeMount') }, mounted() { console.log('mounted') }, beforeUpdate() { console.log('beforeUpdate') }, updated() { console.log('updated') }, beforeDestroy() { console.log('beforeDestroy') }, destroyed() { console.log('destroyed') }, })
script> html>

总结

DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>引出生命周期title>
		
		<script type="text/javascript" src="../js/vue.js">script>
	head>
	<body>
		
		
		<div id="root">
			<h2 :style="{opacity}">欢迎学习Vueh2>
			<button @click="opacity = 1">透明度设置为1button>
			<button @click="stop">点我停止变换button>
		div>
	body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		 new Vue({
			el:'#root',
			data:{
				opacity:1
			},
			methods: {
				stop(){
					this.$destroy()
				}
			},
			//Vue完成模板的解析并把初始的真实DOM元素放入页面后(挂载完毕)调用mounted
			mounted(){
				console.log('mounted',this)
				this.timer = setInterval(() => {
					console.log('setInterval')
					this.opacity -= 0.01
					if(this.opacity <= 0) this.opacity = 1
				},16)
			},
			beforeDestroy() {
				clearInterval(this.timer)
				console.log('vm即将驾鹤西游了')
			},
		})

	script>
html>

附录:

1、类库盘点

BootCDN:免费第三方库网站

Moment.js:时间处理js库

day.js:轻量级时间处理js

你可能感兴趣的:(#,VUE,vue.js,javascript,前端)