跳至主要內容

Vue

TenSoFlow...大约 17 分钟前端前端框架Vue

Vue

第01章 Vue官网

Vue官网open in new window

第02章 Vue基础

简介

Vue是一套构建用户界面渐进式JavaScript框架(Vue可以自底向上逐层应用,简单应用只需一个小巧的核心库,复杂应用则可以引入各式各样的Vue插件)。由尤雨溪开发。后起之秀,生态完善,已然成为国内前端工程师必备技能。前身叫Seed,2013年改名为Vue。

特点

特点一:采用组件化模式(将页面分割成一个个组件,每个组件互不影响),提高代码复用率,且让代码更好维护

特点二:声明式编码(传统的命令式编码需要一步一步告诉别人怎么做,声明式编码就是我只告诉你你口渴了,你自己去喝水而无需我告诉你详细步骤),让编码人员无需直接操作DOM,提高开发效率

特点三:使用虚拟DOM+优秀的Diff算法(一种比较算法),尽量复用DOM节点

MVVM模型

M: 模型(Model) ---> 对应data中的数据

V: 视图(View) ---> 模板

VM: 视图模型(ViewModel) ---> 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">
			<!--用插值表达式引用vue实例中data中定义的数据-->
			<!--{{ xxx }}中的xxx要写Js表达式,如可以写{{ name.toUpperCase() }}-->
			<h1>Hello,{{ name }}</h1>
		</div>
		<script type="text/javascript">
			// Vue构造函数里面需要传一个参数,类型是一个对象,通常叫配置对象
			new Vue({
				// el是element的简称 作用是建立起当前vue实例与id为root的容器建立连接
				// 表示当前vue实例为id是root的容器服务
				el: '#root',
                // data用于存储数据供el所指定的容器去使用
				data:{
					name: 'TenSoFlow'
				}
			})
		</script>
	</body>
</html>

Vue实例和div容器是一对一的关系,即一个Vue实例只能对应一个div容器。不存在多个Vue实例对应一个div容器和多个div容器对应一个Vue实例。

el与data的两种写法

<!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>hello,{{name}}</h1>
		</div>
		
		<!-- 第一种写法 -->
		<!-- <script type="text/javascript">
			new Vue({
				el: '#root',
				data:{
					name: 'TenSoFlow',
				}
			})
		</script> -->
		
		<!-- 第二种写法 -->
		<script type="text/javascript">
			const v = new Vue({
				// data的第一种写法对象式
				// data:{
				// 	name: 'TenSoFlow',
				// }
				
				// data的第二种写法函数式 学习组件之后必须用函数式
				data:function(){
					return{
						name: 'TenSoFlow',
					}
				}
			});
			v.$mount('#root'); // 相当于	el: '#root',
			
		</script>
	</body>
</html>

Object.defineProperty

Vue数据绑定的底层就是该方法

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript" src="JS/vue.js"></script>
	</head>
	<body>
		<script type="text/javascript">
			let number = 18;
			let person = {
				name: "TenSoFlow",
				sex: "男",
			}
			
			// Object.defineProperty可以向对象中自定义的增加属性
			// 如下是向对象person中增加age属性
			Object.defineProperty(person,'age',{
				value: 18, // 设置age的值为18
				enumerable: true, // 控制该属性是否可以被枚举,默认值是false
				writable: true, // 控制该属性是否可以被修改,默认值是false
				configurable: true, // 控制该属性是否可以被删除,默认值是false
				
				// 当有人读取person的age属性时,get函数就会被调用,且返回值是age的值
				get(){
					// 此方法可以把age属性与number变量关联起来,只要number变则age就变
					return number;
				},
				
				// 当有人修改person的age属性时,set函数就会被调用,且会收到修改的具体值
				set(value){
					number = value;
				}
			})
		</script>
		
	</body>
</html>

数据代理

数据代理就是通过一个对象代理对另一个对象中属性的操作

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript" src="JS/vue.js"></script>
	</head>
	<body>
		<script type="text/javascript">
			let obj = {x:100};
			let obj2 = {y:200};
			Object.defineProperty(obj2,'x',{
				get() {
					return obj.x;
				},
				set(value) {
					obj.x = value;
				}
			})
		</script >
	</body>
</html>

v-on 及事件处理

<!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>
			<!-- 绑定点击事件,方法为ShowInfo -->
			<button v-on:click="ShowInfo">点我提示信息</button>
			<!-- 简写形式 -->
			<button @click="ShowInfo">点我提示信息1</button>
			
			<!--
				1.prevent 阻值默认事件
				2.stop 阻值事件冒泡
				3.once 事件只触发一次
				4.capture 使用事件的捕获模式
				5.self 只有event.target是当前操作的元素时才触发事件
				6.passive 事件的默认行为立即执行,无需等待事件回调执行完毕 
			-->
            
            <!-- 修饰符可以连续写如 @click.prevent.stop -->
			
			<!-- prevent阻值默认事件 即阻值a标签的跳转页面 -->
			<a href="https://www.baidu.com" @click.prevent='ShowInfo()'>点我跳转页面</a>
			
			<!-- once事件只触发一次 即只能点一次-->
			<button @click.once="ShowInfo()">点我提示信息</button>
			
		</div>
		<script type="text/javascript">
			new Vue({
				el: '#root',
				data: {
					name: 'TenSoFlow'
				},
				methods: {
					// 方法必须写在methods中
					ShowInfo () {
						alert('同学你好!');
					}
				}
			})
		</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">
			<h2>欢迎来到{{ name }}的网页</h2>
			
			<!-- 
				vue中常见按键别名
				enter 回车
				delete 删除
				esc 退出
				space 空格
				tab 换行 (特殊 必须使用@keydown.tab)
				up 上
				down 下
				left 左
				right 右 
			-->
			<!-- 按下回车才会执行ShowInfo方法 -->
			<input type="text" placeholder="按下回车提示输入" @keyup.enter="ShowInfo()"/>
			
		</div>
		<script type="text/javascript">
			new Vue({
				el: '#root',
				data: {
					name: 'TenSoFlow'
				},
				methods: {
					// 方法必须写在methods中
					showInfo () {
						alert('同学你好!');
					}
				}
			})
		</script>
	</body>
</html>

v-if

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript" src="JS/vue.js"></script>
	</head>
	<body>
		<div id="root">
			<!-- v-if可以控制是否存在此标签
				 值可以是true或者false
				 亦或者是有真假的表达式 如 1 === 3 
				 和v-if一起出现的还有v-else-if以及v-else 
				 和Java中if else-if else表达的意思是一样的
			 -->
			<h2 v-if="true">欢迎来到{{ name }}的网页</h2>
		</div>
		<script type="text/javascript">
			const vm = new Vue({
				el: '#root',
				data:{
					name: 'TenwSoFlow',
				},
			})
		</script>
	</body>
</html>

v-pre

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript" src="JS/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<!-- 
				v-pre指令能跳过其所在节点的编译过程
				可利用它跳过没有使用指令语法,没有插值语法的节点,会加快编译。 
			-->
			<h2 v-pre>Vue其实很简单</h2>
			<h2>现在的n值:{{n}}</h2>
			<button @click="n++">点我n+1</button>
		</div>
		
		<script>
		new Vue({
		  el: '#app',
		  data: {
		   name: 'TenSoFlow',
		   n: 1
		  },
		});
		</script>
	</body>
</html>

v-for

<!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>
			<ul>
				<!-- 遍历数组 -->
				<!-- 第一种写法 -->
				<li v-for="person in persons" :key="person.id">
					姓名:{{ person.name }}
					年龄:{{ person.age }}
				</li>
				<br>
				
				<!-- 遍历数组 --> 
				<!-- 第二种写法 有下标-->
                <!-- 最好用person.id做key而不是index -->
				<li v-for="(person, index) in persons" :key="person.id">
					姓名:{{ person.name }}---{{ index }}
					年龄:{{ person.age }}---{{ index }}
				</li>
				<br>
				
				<!-- 遍历对象-->
				<h2>汽车信息</h2>
				<ul>
					<li v-for="(value, key) in car" :key="key">
						{{ key }}----{{ value }}
					</li>
				</ul>
				
				<!-- 遍历字符串-->
				<h2>测试遍历字符串</h2>
				<ul>
					<li v-for="(i, index) in string" :key="index">
						{{ i }}---{{ index }}
					</li>
				</ul>
				
			</ul>
		</div>
		<script type="text/javascript">
			const vm = new Vue({
				el: '#root',
				data: {
					name: 'TenwSoFlow',
					persons: [
						{ id:'001',name:'张三',age:19 },
						{ id:'002',name:'李四',age:23 },
						{ id:'003',name:'王五',age:21 }
					],
					car: {
						name:'奥迪A8',
						price:'70w',
						color:'黑色'
					},
					string:'Hello TenSoFlow'
				},
			})
		</script>
	</body>
</html>

v-show

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript" src="JS/vue.js"></script>
	</head>
	<body>
		<div id="root">
			<!-- v-show可以控制是否显示此标签 
				 值可以是true或者false
				 亦或者是有真假的表达式 如 1 === 3 
			 -->
			<h2 v-show="true">欢迎来到{{ name }}的网页</h2>
			<br/>
		</div>
		<script type="text/javascript">
			const vm = new Vue({
				el: '#root',
				data: {
					name: 'TenwSoFlow',
				},
			})
		</script>
	</body>
</html>

v-bind

v-bind 是一个用于动态绑定 HTML 特性的指令。它的作用是将一个表达式的值绑定到指定的 HTML 特性,使其动态地根据 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">
			<h1>Hello, {{ name }}</h1>
			<h1>指令语法 v-bind</h1>
			<a v-bind:href="url">点我跳转页面1</a>
			<!-- 简写 v-bind 可以简写成 : -->
			<a :href="url">点我跳转页面2</a>
		</div>
		
		<script type="text/javascript">
			new Vue({
				el: '#root',
				data: {
					name: 'TenSoFlow',
					url: 'https://www.baidu.com',
				}
			})
		</script>
	</body>
</html>

在上面的例子中,:href 就是 v-bind 的缩写。这里的 url 是一个在 Vue 实例中定义的数据属性,它的值会动态地绑定到 <a> 元素的 href 特性上。当 url 的值发生变化时,相关的 HTML 特性也会被更新。

v-text

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript" src="JS/vue.js"></script>
		<script src="https://cdn.bootcdn.net/ajax/libs/dayjs/1.11.9/dayjs.min.js">				</script>
	</head>
	<body>
		<div id="app">
			<h2>Hello,{{ name }}</h2>
			<div v-text='name'></div>
		</div>
		
		<script>
		new Vue({
		  el: '#app',
		  data: {
		  	name: 'TenSoFlow'
		  },
		});
		</script>
	</body>
</html>

v-html

v-html有安全性问题,容易导致XSS攻击

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript" src="JS/vue.js"></script>
		<script src="https://cdn.bootcdn.net/ajax/libs/dayjs/1.11.9/dayjs.min.js"></script>
	</head>
	<body>
		<div id="app">
			<h2>Hello,{{name}}</h2>
			<!-- v-text是完全把str当作字符串 -->
			<div v-text='str'></div>
			<!-- v-html可以把str字符串解析成html页面 -->
			<div v-html='str'></div>
		</div>
		
		<script>
		new Vue({
		  el: '#app',
		  data: {
		   name: 'TenSoFlow',
		   str: '<h3>TenSoFlow</h3>'
		  },
		});
		</script>
	</body>
</html>

v-once

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript" src="JS/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<!-- 			
				v-once所在节点在初次动态渲染之后,就视为静态内容了
				以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能 
			-->
			<h2 v-once>初始值n值:{{n}}</h2>
			<h2>现在的n值:{{n}}</h2>
			<button @click="n++">点我n+1</button>
		</div>
		
		<script>
		new Vue({
		  el: '#app',
		  data: {
		   name: 'TenSoFlow',
		   n: 1
		  },
		});
		</script>
	</body>
</html>

v-model

<!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-bind:value="name">
			<br/>
			双向数据绑定:<input type="text" v-model:value="name">
			
			<!-- 简写 -->
			<br/>
			单向数据绑定:<input type="text" :value="name">
			<br/>
			双向数据绑定:<input type="text" v-model="name">
			
			<!-- 以下代码是错误的,因为v-model只能应用在表单类元素上 -->
			<h2 v-model:x="name">Hello</h2>
		</div>
		
		<script type="text/javascript">
			new Vue({
				el: '#root',
				data: {
					name: 'TenSoFlow',
				}
			})
		</script>
	</body>
</html>

v-bind数据只能从data流向页面,v-model则可以双向流通。v-model一般都应用在表单类元素即输入类元素上如input select等。简单说应用在有value属性的表单类元素上。

自定义指令

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript" src="JS/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<h2>当前的n值:<span v-text="n"></span></h2>
			<h2>放大10倍后的n值是:<span v-big="n"></span></h2>
			<button @click="n++">点我n+1</button>
			<hr>
			<input type="text" v-fbind="n">
		</div>
		
		<script>
		new Vue({
		  el: '#app',
		  data: {
		   name: 'TenSoFlow',
		   n: 1
		  },
		  // 自定义v-xxx指令
		  directives: {
			  // 第一种写法 函数式
			  // element是与v-big绑定的span标签,binding是与v-big绑定的data中的n
			  // big函数调用时机 1.指令与元素成功绑定(一上来) 2.指令所在模板被重新解析时
			  big(element, binding) {
				  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>
	</body>
</html>

计算属性

计算属性 computed。计算属性是不存在的要通过已有的属性计算得来。

<!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" v-model="firstName"/> <br/>
			名:<input type="text" v-model="lastName"/> <br/>
			全名:<span>{{ fullName }}</span>
		</div>
		<script type="text/javascript">
			new Vue({
				el: '#root',
				data: {
					firstName: 'TenSo',
					lastName:'Flow'
				},
				methods: {
					// 方法必须写在methods中
					ShowInfo () {
						alert('同学你好!');
					}
				},
				// 计算属性
				computed:{
					fullName: {
						// 当有人读取fullName时,get就会被调佣,且返回值就作为fullName的值
						get () {
							return this.firstName + '-' + this.lastName;
						}
					},
					// 简写
					fullName () {
                        return this.firstName + '-' + this.lastName;
                    }
				}
			})
		</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">
			<h2>欢迎来到{{ name }}的网页</h2>
			<br>
			<h2>今天天气很{{ info }}</h2>
			<button @click="changeWeather">切换天气</button>
		</div>
		<script type="text/javascript">
			const vm = new Vue({
				el: '#root',
				data: {
					name: 'TenwSoFlow',
					isHot: true
				},
				methods: {
					changeWeather () {
						this.isHot = !this.isHot;
					}
				},
				computed: {
					info () {
                        return this.isHot ? '炎热' : '凉爽';
                    }
				},
				// 监视属性
				watch:{
					// 表示监视的属性是isHot
					isHot:{
						// 配置属性,为true时表示初始化时让handler调用一下
						immediate: true,
						// handler当isHot被修改时调用,其中第一个参数是修改后的值,第二个参数是原始值
						handler(newvalue,oldValue){
							console.log('handler被修改了');
						}
					}
				}
			})
			// 第二种写法 用实例调用
			// vm.$watch('isHot',{
			// 	// 配置属性,为true时表示初始化时让handler调用一下
			// 	immediate: true,
			// 	// handler当isHot被修改时调用,其中第一个参数是修改后的值,第二个参数是原始值
			// 	handler(newvalue,oldValue){
			// 		console.log('handler被修改了');
			// 	}
			// })
		</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">
			<h2>欢迎来到{{name}}的网页</h2>
			<br>
			<h2>a的值是{{number.a}}</h2>
			<button @click="number.a++">点我让a加1</button>
			<br/>
			<h2>b的值是{{number.b}}</h2>
			<button @click="number.b++">点我让b加1</button>
		</div>
		<script type="text/javascript">
			const vm = new Vue({
				el: '#root',
				data:{
					name: 'TenwSoFlow',
					number:{
						a: 1,
						b: 2
					}
				},
				watch:{
					// 监视多级结构中的某个属性的变化要加'' 而不是直接写number.a
					// 此时只有a变才会调用handler,b变不会调用
					// 'number.a':{
					// 	handler(){
					// 		console.log('a被改变了')
					// 	}
					// },
					
					// 监视多级结构中的所有属性的变化
					// 此时只要a和b中的某一个发生变化则都会调用handler
					number:{
						// 要想实现深度监视需要配置deep为true
						deep: true,
						handler(){
							console.log('number被改变了')
						}
					}
				}
			})
		</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="app">
		  <!-- v-model绑定的数据都是各输入框的value值 -->
		  <!--
			  收集表单数据: 
			  若: <input type="text"/>, 则v-mode1收集的是value值,用户输入的就是value值。
			  若: <input type="radio" />,则v-mode1收集的是value值,且要给标签配置value值。
			  若: <input type="checkbox"/> 
				  1.没有配置input的value属性,那么收集的就是checked (勾选or未勾选,是布尔值)
				  2.配置input的value属性:
					  (1)v-mode1的初始值是非数组,那么收集的就是checked (勾选or未勾选,是布尔值)
					  (2)v-mode1的初始值是数组,那么收集的就是value组成的数组
			  备注: v-mode1的三个修饰符:
				  v-mode1.lazy:失去焦点再收集数据
				  v-mode1.number:输入字符串转为有效的数字
				  v-mode1.trim:输入首尾空格过滤
		  -->
		  <h2>用户注册表单</h2>
		  <form @submit.prevent="submitForm">
		    <div>
		      <label for="username">账号:</label>
		      <input type="text" id="username" v-model="formData.username" required>
		    </div>
		    <div>
		      <label for="password">密码:</label>
		      <input type="password" id="password" v-model="formData.password" required>
		    </div>
		    <div>
		      <label>性别:</label>
		      <input type="radio" id="male" value="male" v-model="formData.gender"> <label for="male"></label>
		      <input type="radio" id="female" value="female" v-model="formData.gender"> <label for="female"></label>
		    </div>
		    <div>
		      <label>爱好:</label>
		      <input type="checkbox" id="hobby1" value="篮球" v-model="formData.hobbies"> <label for="hobby1">篮球</label>
		      <input type="checkbox" id="hobby2" value="足球" v-model="formData.hobbies"> <label for="hobby2">足球</label>
		      <input type="checkbox" id="hobby3" value="游泳" v-model="formData.hobbies"> <label for="hobby3">游泳</label>
		    </div>
		    <div>
		      <label for="campus">所属校区:</label>
		      <select id="campus" v-model="formData.campus">
		        <option value="校区A">校区A</option>
		        <option value="校区B">校区B</option>
		        <option value="校区C">校区C</option>
		      </select>
		    </div>
		    <div>
		      <label for="other">其他信息:</label>
		      <textarea id="other" v-model="formData.other"></textarea>
		    </div>
		    <div>
		      <input type="checkbox" id="agreement" v-model="formData.agreement"> <label for="agreement">我已阅读并同意用户协议</label>
		    </div>
		    <button type="submit" :disabled="!formData.agreement">提交</button>
		  </form>
		</div>
		
		<script>
		new Vue({
		  el: '#app',
		  data: {
		    formData: {
		      username: '',
		      password: '',
		      gender: '',
		      hobbies: [],
		      campus: '',
		      other: '',
		      agreement: false
		    }
		  },
		  methods: {
		    submitForm() {
		      // 在此处可以将formData对象转化为JSON数据 发送给服务器或执行其他操作
		      console.log('表单数据:', JSON.stringify(this.formData));
		      alert('表单提交成功!');
		    }
		  }
		});
		</script>
	</body>
</html>

过滤器

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript" src="JS/vue.js"></script>
		<script src="https://cdn.bootcdn.net/ajax/libs/dayjs/1.11.9/dayjs.min.js"></script>
	</head>
	<body>
		<div id="app">
			<!--
				过滤器格式 value | 过滤的方法
				{{time | timeFormater}}意思就是有一个timeFormater函数
				对time这个值进行处理,返回的值当作显示在页面上的内容 
			-->
			<h2>现在是:{{time | timeFormater}}</h2>
		</div>
		
		<script>
		new Vue({
		  el: '#app',
		  data: {
		   time:1708404429838 // 时间戳
		  },
		  filters:{
			  timeFormater(value){
				  console.log(Date.now())
				  return dayjs(value).format('YYYY-MM-DD HH:mm:ss')
			  }
		  }

		});
		</script>
	</body>
</html>

第03章 Vue生命周期

<!DOCTYPE html>
<html>
   <head>
   	<meta charset="utf-8">
   	<title></title>
   	<script type="text/javascript" src="JS/vue.js"></script>
   </head>
   <body>
   	<div id="app">
   		<h2 :style="{opacity}">欢迎你{{name}}</h2>
   	</div>
   	
   	<script>
   	const vm = new Vue({
   	  el: '#app',
   	  data: {
   	   name: 'TenSoFlow',
   	   opacity: 1
   	  },
   	  methods: {
   		  
   	  },
   	  // 以下都是生命周期函数
   	  // 无法访问data中的数据 methods中的方法
   	  beforeCreate(){
   		  console.log('beforeCreate')
   	  },
   	  // 可以访问data中的数据 methods中的方法
   	  created(){
   		  console.log('created')
   	  },
   	  
   	  beforeMount(){
   		  console.log('beforeMount')
   	  },
   	  // Vue完成模板的解析并把初始的真实DOM元素放入页面后调用mounted
   	  mounted(){
   		  setInterval(() => {
   			  this.opacity -= 0.01
   			  if(this.opacity <= 0) this.opacity = 1
   		  },16)
   	  },
   	  // 数据是新的,页面是旧的
   	  beforeUpdate(){
   		  console.log('beforeUpdate')
   	  },
   	  // 数据是新的,页面也是新的
   	  updated(){
   		  console.log('updated')
   	  },
   	  beforeDestroy(){
   		  console.log('beforeDestroy') 
   	  },
   	  destroyed(){
   		  
   	  }
   	
   	});

   	</script>
   </body>
</html>

第04章 Vue组件

组件就是实现应用中局部功能代码和资源的集合

非单文件组件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript" src="JS/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<!-- 使用组件 -->
			<school></school>
			<hr>	
			<!-- 使用组件 -->
			<student></student>
		</div>
		
		<script>
			// 定义组件
			const school = Vue.extend({
				template: `
					<div>
						<h2>学校名称:{{name}}</h2>
						<h2>学校地址:{{address}}</h2>
					</div>
				`,
				// data必须写成函数式避免组件被重复使用时,数据存在引用关系
				data(){
					return {
						name:'清华大学',
						address:'北京'
					}
				}
			})
			// 定义组件
			const student = Vue.extend({
				template: `
					<div>
						<h2>学生姓名:{{name}}</h2>
						<h2>学生年龄:{{age}}</h2>
					</div>
				`,
				data(){
					return {
						name:'张三',
						age:18
					}
				}
			})
			new Vue({
				el:'#app',
				// 注册组件
				components:{
					school,
					student
				}
			})
		</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="app">
			<!-- 使用组件 -->
			<school></school>
			<hr>	
		</div>
		
		<script>
			// 定义组件
			const student = Vue.extend({
				template: `
					<div>
						<h2>学生姓名:{{name}}</h2>
						<h2>学生年龄:{{age}}</h2>
					</div>
				`,
				data(){
					return {
						name:'张三',
						age:18
					}
				}
			})
			// 定义组件
			const school = Vue.extend({
				template: `
					<div>
						<h2>学校名称:{{name}}</h2>
						<h2>学校地址:{{address}}</h2>
						<hr>
						<student></student>
					</div>
				`,
				// data必须写成函数式避免组件被重复使用时,数据存在引用关系
				data(){
					return {
						name:'清华大学',
						address:'北京'
					}
				},
				components:{
					student
				}
			})
			new Vue({
				el:'#app',
				// 注册组件
				components:{
					school,
				}
			})
		</script>
	</body>
</html>

第05章 Vue模板

<template>
  <div>

  </div>
</template>

<script>

export default {
  props: {},
  components: {},
  data() {
    return {

    }
  },
  computed: {},
  created() {},
  mounted() {},
  methods: {

  },
}
</script>

<style scoped>

</style>

第06章 Vue脚手架

Vue脚手架(Vue Cli)是Vue官方提供的标准化开发工具(开发平台)

使用步骤

第一步:全局安装@vue.cli (仅第一次执行)

在cmd窗口下执行下列命令
安装前先设置淘宝镜像加快安装速度:npm config set registry=http://registry.npm.taobao.org
然后执行安装命令:npm install -g @vue/cli
安装完成后重新打开cmd窗口输入vue按下回车能出现一大群字符则安装成功

第二步:在cmd中切换到你要创建项目的目录,然后使用命令创建项目

vue create xxxx   xxxx为你想创建项目的名称

第三步:启动项目

npm run serve

第07章 Vuex

概念

专门在Vue中实现集中式状态(数据)管理等一个vue插件

作用

实现数据共享

安装

npm i vuex@3  //@后面可以指定版本号

第08章 Vue路由

简介

Vue的一个插件,专门用来实现SPA应用(单页面Web应用),点击页面中的导航链接不会刷新页面,只会做页面的局部更新。

安装

npm install vue-router@3 //@后面可以指定版本
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.8