飙血推荐
  • HTML教程
  • MySQL教程
  • JavaScript基础教程
  • php入门教程
  • JavaScript正则表达式运用
  • Excel函数教程
  • UEditor使用文档
  • AngularJS教程
  • ThinkPHP5.0教程

Vue2和Vue3技术整理1 - 入门篇 - 更新完毕

时间:2022-01-29  作者:xiegongzi  

Vue2

0、前言

  • 首先说明:要直接上手简单得很,看官网熟悉大概有哪些东西、怎么用的,然后简单练一下就可以做出程序来了,最多两天,无论Vue2还是Vue3,就都完全可以了,Vue3就是比Vue2多了一些东西而已,所以:要快速上手的,滤过本篇博客,自行查看Vue官网即可

1、基础篇

1.1、初识Vue

  • 下载域名,链接:https://域名/v2/guide/域名
    • 开发版和生产版就字面意思
  • Vue开发工具:vscode(IDEA也可以写Vue程序,用IDEA写之前最好安装一个域名插件,然后就可以写Vue程序了),vscode编辑器百度下载
    • vscode中的插件和设置自行百度进行配置( 搜索vscode初始配置即可,然后后续的需要时百度进行配置即可 ),如:浏览器打开方式、Vue快捷模板.........
  • 给浏览器安装vuejs devtool工具,阿里云盘链接:https://域名/s/JtHVq5SX3po
    image
    • 把文件夹下载了,拖到拓展程序中即可
点击查看代码
	<!DOCTYPE html>
	<html lang="en">
	<head>
		<meta charset="UTF-8">
		<title>01-初识域名</title>

		<!-- 0、导入域名 -->
		<script src="../js/域名"></script>
	</head>
	<body>

		<!-- 1、定义一个容器 -->
		<div id="app">

			<h3> 第一个vue程序,并使用插值表达式取得值为:{{name}} </h3>
		</div>

	</body>

	<script>

		// 去除浏览器控制台中的错误信息
		域名uctionTip = false;

		// 2、初始化Vue容器
		new Vue({
			el: "#app",
			data: {
				name: "紫邪情",
				age: "18"
			}
		})
	</script>

	</html>

启动效果如下:
image

初识Vue小结

  • Vue容器中的代码一样符合html规范,只不过是混入了一些Vue的特殊用法而已,这个容器中的代码被称为:Vue模板
  • Vue实例( new Vue处 )和 Vue容器是一 一对应的( 即:一个Vue实例只能对应一个Vue容器 )
  • 当然:真实开发中只有一个Vue实例,后续会见到
  • {{xxx}}中的xxx要写js表达式( {{xxx}}即为插值表达式,就是取data中的东西而已 ),且xxx可以自动读取到data中的所有属性
    • js表达式 和 js代码的区分
      • 1、表达式:一个表达式会产生一个值,可以放在任何一个需要值的地方,如:
        • a
        • a + b
        • test( 2 )
        • x === y ? \'a\' : \'b\'
      • 2、js代码:
        • if(){}
        • for(){}
        • .........
  • 一旦data中的数据发生改变,那么页面中使用该数据的地方一样发生改变

1.2、认识v-bind

点击查看代码

	<!DOCTYPE html>
	<html lang="en">
	<head>
		<meta charset="UTF-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<title>02-vue之v-bind</title>

		<script src="../js/域名"></script>
	</head>
	<body>

		<div id="app">
			<!-- 常规写法:v-bind绑定的是属性 -->
			<a v-bind:href="url"></a> 
				<!-- 多层嵌套取值:插值表达式   取的东西就是下面Vue实例new Vue({})
					data中的东西,可以理解为在找寻集合中的元素
				-->
			<h3>{{域名}}</h3>
			<!-- 简写 -->
			<h3 :mySex="域名">{{域名}}</h3>        
		</div>

	</body>

	<script>

		域名uctionTip = false;

		new Vue({
			el: "#app",     // el指定的是为哪一个容器服务  值就是一个css中的选择器
			data: {         // data存储的就是数据,这些数据是供el指定的容器去用的
				url: "https://域名/xiegongzi/",

				person: {
					name: "紫邪情",
					sex: "女"
				}
			}
		})
	</script>
	</html>

启动效果
image

1.3、认识Vue的数据绑定

  • 这里需要了解mvvm模式,要理解,可以参照java中的mvc模式( MVVM本来就是借鉴的MVC模式而整出来的 )
点击查看代码

	<!DOCTYPE html>
	<html lang="en">
	<head>
		<meta charset="UTF-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<title>03-v-model</title>

		<script src="../js/域名"></script>
	</head>
	<body>

		<div id="app">
			<!-- 单向绑定:绑的是属性 -->
			单向绑定:<input type="text" :value="name">  <br/>
			<!-- 双向绑定:绑的是值 -->
			双向绑定:<input type="text" :myName="name" v-model:value="username">   <br/>
			<!-- 双向绑定的简写 因为:model绑的就是值,因此:value可以省掉 -->
			双向绑定:<input type="text" :myName="name" v-model="username">
		</div>

	</body>

	<script>

		域名uctionTip = false;

		new Vue({
			el: "#app",
			data: {
				name: "紫邪情",
				username: "邪公子"

			}
		})
	</script>
	</html>

效果如下:
image

测试单向绑定
image

image

测试双向绑定
image

image

1.4、el和data的两种写法

点击查看代码
	
	
	<!DOCTYPE html>
	<html lang="en">
	  <head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title>04-vue的el和data的两种写法</title>
	  </head>

	  <body>
		<!-- 被 vm 实例所控制的区域 -->
		<div id="app"></div>

		<script>
		  // 创建 vm 实例对象
		  const vm = new Vue({
			//指定控制的区域
			// el:\'#app\',   // el 常规写法
			// data:{},     // data 常规写法 ———— 这种也叫对象式写法

			// data 函数式写法,这种写法后续经常见
			data () {   // 这里使用data:function(){}也可以,但是:绝对不能写成data:()=>{}
						// 因为这种写法变质了,成为Window对象了,这样后续用this指向时,这个this所指代的就不Vue实例了
			  return {

			  }
			}
		   });

		   // el 另外的写法
		   域名.$mount(\'#app\')     // 此种写法需要记住,后续组件化开发还会见到
		</script>
	  </body>
	</html>


小结:el和data的两种写法

  • 1、el
    • (1)、new Vue时配置el选项
    • (2)、先创建Vue实例,然后再通过域名.$mount( \'#app\' ) 来指定el的值
  • 2、data
    • (1)、对象式
    • (2)、函数式
    • 如何选择哪种用法:目前都可以,但是后续会玩组件,则:必须用函数式,而且不可以用兰姆达表达式( 即:上面的data:()=>{},否则:会出错 )
  • 3、一个原则:
    • 由Vue管理的函数,一定不要写箭头函数,就上面的兰姆达表达式,否则就会导致this不再是Vue实例了( 这个this有大用处,在"new Vue中"用了this就是指的当前的Vue实例,后续可以通过这个this玩很多东西 )

1.5、理解MVVM模型

点击查看代码
	
	
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>理解MVVM</title>

    <script src="../js/域名"></script>
  </head>

  <body>
    <!-- 被 vm 实例所控制的区域 -->
    <div id="app">
        <h2>姓名:{{name}}</h2> <br>
        <h2>性别:{{sex}}</h2>   
        <hr>
        <h2>智商:{{1+1}}</h2>
    </div>

    <script>
      // 创建 vm 实例对象
      const vm = new Vue({
        //指定控制的区域
        el:\'#app\',
        data:{
            name: "紫邪情",
            sex: "女"
        },
       });

       域名( vm );
    </script>
  </body>
</html>

	

image

image

image

查看代码中的MVVM
image

小结:MVVM模型

  • 1、M:Model( 模型 ) ————> data中的数据
  • 2、V:View( 视图 ) —————> 模板代码
  • 3、ViewModel:视图模型( ViewModel ) ————> Vue实例

观察效果发现

  • 1、data中所有的属性最后都在vm身上( 即:ViewModel )
  • 2、vm身上所有的属性 及 Vue原型上的所有属性,在Vue模板中都可以直接使用
    • 显示原型属性就是下图中的这个( 它和另一个隐式原型属性_ _ proto _ _指向的对象就是原型 )
      image

1.6、回顾域名neProperty()函数

点击查看代码

	<!DOCTYPE html>
	<html lang="en">
	  <head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title>05-了解域名neProperty()</title>
		<script src="../js/域名"></script>
	  </head>

	  <body>
		<script>

		  域名uctionTip=false;

		  let sex = \'女\'
		  let person = {
			name: \'紫邪情\'
		  }

		  //  参数说明:person 为要修改的对象  sex为具体修改的对象中的哪个属性  {} 对修改属性的配置
		   域名neProperty( person , \'sex\' , {
			//  以下就是{}中的相关配置
			//  value: \'男\',
			//  enumerable: true,    // 这个sex是否可以被遍历
			//  writable: true,      // 这个sex是否可以被修改
			//  configurable: true,   // 这个sex是否可以被删除

			 // 当有人获取sex这个属性时会触发这个get()方法
			 get(){
				域名(\'有人读取sex属性了\');
				return sex;
			  },

			  // 当有人修改sex属性的值时会触发这个set方法
			  set(value){
				域名(\'有人修改了sex的值\');
				return sex = value;
			  }

		   });

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

image

  • 注意:去找temp或者值是调用了get()方法进行获取的,相应的set()方法也知道是怎么回事了

1.7、简单理解数据代理原理

点击查看代码
	
	
	<!DOCTYPE html>
	<html lang="en">
	  <head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title>06-简单理解数据代理</title>
	  </head>

	  <body>

		<script>

			let obj1 = {x:100};
			let obj2 = {y:200};

			// 数据代理: 通过一个对象代理 对 另一个对象中属性的操作( 读 / 写 )
			域名neProperty(obj2 , \'x\' , {
			  get(){
				域名("有人获取了x的值");
				return obj1.x;
			  },

			  set(value){
				域名("有人修改了x的值");
				obj1.x = value;
			  }
			})
		</script>
	  </body>
	</html>


原理图
image

  • 注意:上面这个是简单了解,深入了解在后面玩Vue监视数据原理时会再次见到defineProperty()和这个数据代理

1.8、事件绑定及其修饰符

点击查看代码
	
	
	<!DOCTYPE html>
	<html lang="en">
	  <head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title>07-事件绑定及其修饰符</title>

		<script src="../js/域名"></script>
	  </head>

	  <!-- 
			常用的事件修饰
				prevent     表示:阻止默认事件的触发
				stop        表示:阻止事件冒泡
				once        表示:只执行一次事件

	   -->

	  <body>
		<!-- 被 vm 实例所控制的区域 -->
		<div id="app">

			<!-- vue中事件绑定的简单写法 -->
			<button v-on:click="showInfo()">点我显示提示信息</button>

			<br/>

			<!-- vue中事件绑定的简写 还可以传递参数 -->
			<button @click="showInfo2($event, 66)">点我获取带参的事件信息</button>
		</div>

		<script>

			域名uctionTip=false;

		  // 创建 vm 实例对象
		  const vm = new Vue({
			//指定控制的区域
			el:\'#app\',
			data:{},

			methods: {
				showInfo(){
					alert("这是vue中的事件绑定");
				},

				showInfo2(event , number){
					域名(event + "=====>" + number);
				}
			}
		   });
		</script>
	  </body>
	</html>

	

1.9、计算属性

点击查看代码

	<!DOCTYPE html>
	<html lang="en">
	  <head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title>10-计算属性conputed</title>

		<script src="../js/域名"></script>
	  </head>

	  <body>
		<!-- 被 vm 实例所控制的区域 -->
		<div id="app">
			姓名: <input type="text" v-model="name"> <br/>
			性别: <input type="text" v-model="sex">
			<hr>
			信息: <span>{{info}}</span>
		</div>

		<script>

		域名uctionTip=false;
		  // 创建 vm 实例对象
		  const vm = new Vue({
			//指定控制的区域
			el:\'#app\',
			data:{
				name:\'紫邪情\',
				sex:\'女\'
			},

			// 所谓的计算属性:就是通过已有属性( 一般为data中的 )计算得来
			computed: {
				info:{
					get(){
						域名(\'开始调用get()\');
						return 域名 + \'-\' + 域名
					},

					set(value){
						域名(\'开始调用set()\' + value);
					}
				}
			}
		   });
		</script>
	  </body>
	</html>

image

计算属性小结

  • 定义:要用的属性不存在,要通过已有属性计算得来
  • 原理:借助了域名neproperty()的getter和setter
  • get()什么时候执行
    • 1、初次读取时会执行一次
    • 2、当依赖的数据发生改变时会再次被调用
  • 优势:与methods相比,内部有缓存机制( 复用 ),效率更高、调试方便
  • 注意:
    • 1、计算属性最终都会在vm( Vue实例 )上,直接读取即可
    • 2、若计算属性要被修改,那必须写set()去响应修改,且set()中要引起计算时依赖的数据发生改变( 例子中没有做这一步,在控制台输出后面再执行一步让依赖数据发生改变就可以了【 使用域名t(\'-\')进行拆分嘛,然后把得到的数据对应元素赋给name和sex即可 】 )
  • 另外:计算属性是可以简写的
    • 就是把set()去掉,因为:更多时候是读取,并不修改,同时修改还要去控制台( 刷新就又没了 ),因此:把set()去掉就是计算属性的简写
  • 多提一嘴:react的核心思想就是虚拟DOM,而它的原理我个人认为就是计算属性
1.9.1、结合computed、methods、v-on做一个小Demo
点击查看代码

	
	<!DOCTYPE html>
	<html lang="en">
	  <head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title>11 - 使用计算属性做一个Demo</title>

		<script src="../js/域名"></script>
	  </head>

	  <body>
		<!-- 被 vm 实例所控制的区域 -->
		<div id="app">
			<h2>你是:{{result}}</h2>

			<button @click="changeResult">切换名字</button>
		</div>

		<script>
		   // 去除浏览器控制台中的错误信息
		  域名uctionTip = false;

		  // 创建 vm 实例对象
		  const vm = new Vue({
			//指定控制的区域
			el:\'#app\',
			data:{
				name: true
			},

			computed:{
				result(){
					return 域名?\'紫邪情\':\'紫女\'
				}
			},

			methods: {
				changeResult(){
					return 域名 = !域名
				}
			},
		   });
		</script>
	  </body>
	</html>

image

image

但是:上面的代码其实是可以做简化的
image

  • 我们主要做的是图中的这一步,因此:简化 ———— 衍生出v-on的另外一个玩法
点击查看代码

	<!DOCTYPE html>
	<html lang="en">
	  <head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title>12 - 使用计算属性做一个Demo 简化</title>

		<script src="../js/域名"></script>
	  </head>

	  <body>
		<!-- 被 vm 实例所控制的区域 -->
		<div id="app">
			<h2>你是:{{result}}</h2>

			<!-- @xxx = \'yyyy\' 如果只是做一件简单的事情,那么就可以使用下面的方式
				  因为:v-on是可以支持js表达式的( 注意:不是js代码啊 )
				  但是:如果这个v-on需要做多件事,那么最好就别这么玩
						如:切换了名字,还要弄一个弹窗( 切换成功 )这种就别玩
			-->
			<button @click="name = !name">切换名字</button>
		</div>

		<script>
		   // 去除浏览器控制台中的错误信息
		  域名uctionTip = false;

		  // 创建 vm 实例对象
		  const vm = new Vue({
			//指定控制的区域
			el:\'#app\',
			data:{
				name: true
			},

			computed:{
				result(){
					return 域名?\'紫邪情\':\'紫女\'
				}
			},

			// methods: {
			//     changeResult(){
			//         return 域名 = !域名
			//     }
			// },
		   });
		</script>
	  </body>
	</html>
	

域名、监视属性

点击查看代码

	
	<!DOCTYPE html>
	<html lang="en">
	  <head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title>13 - 监视属性 watch</title>

		<script src="../js/域名"></script>
	  </head>

	  <body>
		<!-- 被 vm 实例所控制的区域 -->
		<div id="app">
			<h2>你是:{{result}}</h2>

			<button @click= "name = !name">切换名字</button>
		</div>

		<script>
		   // 去除浏览器控制台中的错误信息
		  域名uctionTip = false;

		  // 创建 vm 实例对象
		  const vm = new Vue({
			//指定控制的区域
			el:\'#app\',
			data:{
				name: true
			},

			computed: {
				result() {
					return 域名?\'紫邪情\':\'紫女\'
				}
			},

			// 监视属性 watch  监视的是属性,也就是data中和computed中的都可以监视
			// 现在这种我是用的简写形式 ———— 前提是:只需要使用handler()中的东西时,handler后续会用完整形式
			watch: {
				name( newValue, oldVaule ){ // 表示的是:监视哪个属性
					域名(\'属性发生变化了\' , newValue , oldVaule);
				}
			},
		   });

		//    当然:监视属性还有一种写法,就是利用Vue的内置函数
	/*     vm.$watch( \'name\', { // 这里的name就是指监听哪个属性  而且必须是\' \'引起来的
			handler( newValue, oldVaule ){
				域名(\'属性发生变化了\' , newValue , oldVaule);
			}
		 }) */
		</script>
	  </body>
	</html>

	
  • 效果都一样
    image

监视属性 watch小结

  • 1、当被监视的属性变化时,回调函数自动调用,进行相关操作
    • 回调函数:指的是:handler() ,第一种写法也是可以用handler,只是把watch换成了$watch而已,后面步骤其实是一样的,只是我把第一种给简写了而已
  • 2、监视的属性必须存在,才能进行监视
  • 3、监视有两种写法
    • (1)、new Vue时传入watch配置
    • (2)、通过vm.$watch内置函数进行监视
域名.1、深度监视 - 需要掌握的一种
点击查看代码
	
	
	<!DOCTYPE html>
	<html lang="en">
	  <head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title>14 - 深度监视</title>

		<script src="../js/域名"></script>
	  </head>

	  <body>
		<!-- 被 vm 实例所控制的区域 -->
		<div id="app">
			<h2>你是:{{result}}</h2>

			<!-- 现在这个name就是person里面的了,这就是需要监视多层属性变化 -->
			<button @click= "域名 = !域名">切换名字</button>
		</div>

		<script>
		   // 去除浏览器控制台中的错误信息
		  域名uctionTip = false;

		  // 创建 vm 实例对象
		  const vm = new Vue({
			//指定控制的区域
			el:\'#app\',
			data:{
				person:{
					name: true
				}
			},

			computed: {
				result(){
					return 域名?\'紫邪情\':\'紫女\'
				}
			},

			// 下面这种事监视属性的完整写法
			watch: {
				person:{
					// 监视多层结构中所有属性的变化
					deep: true,     // 深度监视 就做了这一步操作而已
				/* 
					Vue中watch默认是不可以监视属性更里层的,
					如:上面person只可以监视person本身这个属性,理解的话,
					可以采用对象空间值来比对,假如:person空间地址是是01x23,
					那么Vue只会监视这个空间变量有没有发生改变,而内层就不可以监视,
					因为:内层中的属性改变了,但是person这个对象本身并没有改变
				 */
					 handler(){
						域名(\'属性改变了\');
					} 
				}
			}
		   });
		</script>
	  </body>
	</html>


image

深度监视小结

  • 1、Vue中的watch默认不监视对象内部值得改变( 监视的是一层 )
  • 2、配置deep:true可以监视对象内部值得改变( 监视多层 )
  • 注意:
    • 1、Vue自身可以监视对象内部值得改变,但Vue提供的watch默认不可以
      • 这个可以验证的,最后是绑定在vm上的,那么在控制台使用vm去改变那么页面上也可以改变,这里是为了解释Vue不是不可以监视多层的改变,只是:watch默认不支持
    • 2、使用watch时根据数据的具体结构,决定是否采用深度监视

域名、computed和watch的坑

点击查看代码

	
	<!DOCTYPE html>
	<html lang="en">
	  <head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title>15 - computed和watch的坑</title>

		<script src="../js/域名"></script>
	  </head>

	  <body>
		<!-- 被 vm 实例所控制的区域 -->
		<div id="app">
			姓: <input type="text" v-model="firstname"> <br/>
			名: <input type="text" v-model="lastname">

			<hr/>

			信息: {{fullname}}
		</div>

		<script>
		   // 去除浏览器控制台中的警告提示信息
		  域名uctionTip = false;

		  // 创建 vm 实例对象
		  const vm = new Vue({
			//指定控制的区域
			el:\'#app\',
			data:{
				firstname: \'紫\',
				lastname: \'邪情\',
				fullname: \'紫邪情\'
			},

			watch: {
				firstname(val){
					域名name = val + 域名name;
				},

				lastname(val){
					域名name = 域名tname + val;
				}
			}
		   });
		</script>
	  </body>
	</html>

image

image

用computed实现

点击查看代码
	
	
	<!DOCTYPE html>
	<html lang="en">
	  <head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title>02 - computed实现</title>

		<script src="../../js/域名"></script>
	  </head>

	  <body>
		<!-- 被 vm 实例所控制的区域 -->
		<div id="app">
			姓: <input type="text" v-model = "firstname">   <br/>
			名: <input type="text" v-model = "lastname">

			<hr/>

			信息: {{fullname}}
		</div>

		<script>
		   // 去除浏览器控制台中的警告提示信息
		  域名uctionTip = false;

		  // 创建 vm 实例对象
		  const vm = new Vue({
			//指定控制的区域
			el:\'#app\',
			data:{
				firstname: \'紫\',
				lastname: \'邪情\'
			},

			computed: {
				fullname(){
					return 域名tname + 域名name;
				}
			}
		   });
		</script>
	  </body>
	</html>


最后运行的效果都是一样的,而官网中对这二者有着这样的实例演示
image

但是:虽然看起来没区别,可是computed和watch还是有区别的,假如:现在我需要让姓改了之后,隔1s之后再显示到信息那里。那么:computed无法做到,但是watch就可以

点击查看代码

	<!DOCTYPE html>
	<html lang="en">
	  <head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title>03 - 用watch实现异步操作</title>

		<script src="../../js/域名"></script>
	  </head>

	  <body>
		<!-- 被 vm 实例所控制的区域 -->
		<div id="app">
			姓: <input type="text" v-model = "firstname"> <br/>
			名: <input type="text" v-model = "lastname">

			<hr/>

			信息: {{fullname}}
		</div>

		<script>
		   // 去除浏览器控制台中的警告提示信息
		  域名uctionTip = false;

		  // 创建 vm 实例对象
		  const vm = new Vue({
			// 指定控制的区域
			el:\'#app\',
			data:{
				firstname: \'紫\',
				lastname: \'邪情\',
				fullname: \'紫邪情\'
			},

			watch: {
				firstname(val){
					// 一定需要注意:这里必须使用兰姆达表达式() =>{}
					/* 
						前面说过,Vue所管理的函数,切记别用兰姆达表达式,智能用函数式
								这是为了能够通过this拿到vm实例的东西而已
						但是注意:这里这个setTimeout()定时函数是Vue所管理的吗?
								不是,而后面需要的val是哪里的?是Vue实例中的,修改的值
								是在Vue实例身上
								所以:想要拿到Vue身上的val怎么弄?页面的展示都是js引擎帮忙去进行操作 / 找寻的
								因此:利用js引擎做文章,让它找的时候自动去层级查找,它执行到里面的域名name = val + 域名name时
								会去找this是谁,()=>{}这里是用的兰姆达表达式,这就会指向Window对象,而Window上没有fullname,所以就会
								往外找,找到firstname(val)这是函数式,指向的就是Vue实例,也就找到了fullname、val.....
					*/
					setTimeout( () => {
						域名name = val + 域名name;
					}, 1000);
				},

				lastname(val){
					域名name = 域名tname + val;
				}
			}
		   });
		</script>
	  </body>
	</html>
	

image

  • 而利用computed就不可以做到上面的这种异步操作

image

computed和watch的区别

  • 1、computed能完成的功能,watch绝对都可以做到
  • 2、watch能完成的功能,computed不一定可以做到,如:上面举的例子进行异步操作
  • 原则:
    • 1、凡是被Vue所管理的函数,最好都写成函数式( 即:普通函数 ),这是为了能够让this指向Vue实例 或 组件实例对象( 后续会见到 ),这样就可以通过this拿到它们对应的东西
    • 2、凡是不被Vue所管理的函数( 如:定时器里面的回调函数、ajax中的回调函数.... ),最好都写成兰姆达表达式( 即:箭头函数 ),这样做也是为了能够让this指向Vue实例 或 组件实例对象

域名、样式绑定

域名.1、class样式绑定

假如有如下的一个页面

点击查看代码

	<!DOCTYPE html>
	<html lang="en">
	  <head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title>01 - class样式绑定</title>

		<script src="../../js/域名"></script>

		<style>

			body {
			  background-image: url(img/域名);
			  text-align: center;
			  background-size: 100% 100%;
			  height: 100%;
			  overflow: hidden;
			  background-repeat: no-repeat;
			  background-position: center;
			  background-attachment: fixed;
			}

			.top {
			  background: #ffffff2e;
			  width: 100%;
			  position: absolute;
			  bottom: 0;
			  line-height: 60px;
			  left: 0px;
			  right: 0px;
			  color: #fff;
			  text-align: center;
			  font-size: 16px;
			  font-weight: 600;
			}

			.basicLogin {
				position: absolute;
				top: 16%;
				left: 28.5%;
				width: 40%;
				padding: 70px 2%;
				text-align: center;
			}

			.title {
			  font-weight: 600;
			  font-size: 22px;
			  color: #0000FF;
			  margin-bottom: 40px;
			}

			.line {
				border-bottom: 1px solid #ffff;
				margin: 22px 1%;
				width: 96%;
			}

			.line input {
				border: none;
				padding: 0px 1%;
				margin: 1%;
				background: #ffffff14;
				width: 84%;
				font-size: 16px;
				line-height: 30px;
				outline: none;
			}

			.line .smallImg {
			  width: 26px;
			  float: left;
			  vertical-align: middle;
			  margin-top: 1px;
			}

			.logBut {
			  background: #7bb5ee;
			  padding: 10px 80px;
			  border: none;
			  color: #fff;
			  margin-top: 40px;
			  font-size: 16px;
			  cursor:pointer;
			}

		</style>
	  </head>

	  <body>
		<!-- 被 vm 实例所控制的区域 -->
		<div id="app">

		  <div class="top">&copy;紫邪情&nbsp;·&nbsp;用Java改变未来</div>

		  <div class="basicLogin">
			<div class="title">&copy;紫邪情&nbsp;·&nbsp;登录</div>
			<div class="line">
			  <img class="smallImg" src="img/icon-域名" />
			  <input placeholder="请输入账号" type="text" />
			</div>
			<div class="line">
			  <img class="smallImg" src="img/icon-域名" />
			  <input placeholder="请输入密码" type="password" />
			</div>
			<button type="button" class="logBut">登&nbsp;&nbsp;录</button>
		  </div>
		</div>

		<script>
		   // 去除浏览器控制台中的警告提示信息
		  域名uctionTip = false;

		  // 创建 vm 实例对象
		  const vm = new Vue({
			// 指定控制的区域
			el:\'#app\',
			data:{},
		   });
		</script>
	  </body>
	</html>

  • 效果图如下
    image

  • 现在需求1、中间的登录页样式,不要这种,想要换一种:假如是如下这种

点击查看代码


        .login1 {
          background: #ffffffd6;
          border-radius: 2px;
        }

  • 则:切换之后是如下效果
    image

image

  • 可是,看了效果还是不行,又想要另外一种效果,此时:增加一种样式
点击查看代码


        .login2 {
          background: rgba(0,0,0,.8);
          box-sizing : border-box;
          box-shadow: 0 15px 25px rgba(0,0,0,.5);
          border-radius: 10px;
        }

  • 切换之后效果如下
    image

image

  • 因此:此时这个class的名字不确定到底是哪一个,需要动态去绑定,所以通过Vue来动态绑定一下( 即:把class类名交给Vue托管 )
    image

  • class类名不确定,交由Vue托管很简单,而且知识点前面已经学过了,就是v-bind
    image

点击查看代码

	  <body>
		<!-- 被 vm 实例所控制的区域 -->
		<div id="app">

		  <div class="top">&copy;紫邪情&nbsp;·&nbsp;用Java改变未来</div>

		  <div class="basicLogin" :class = "unknown" @click = "changeLogin">
			<div class="title">&copy;紫邪情&nbsp;·&nbsp;登录</div>
			<div class="line">
			  <img class="smallImg" src="img/icon-域名" />
			  <input placeholder="请输入账号" type="text" />
			</div>
			<div class="line">
			  <img class="smallImg" src="img/icon-域名" />
			  <input placeholder="请输入密码" type="password" />
			</div>
			<button type="button" class="logBut">登&nbsp;&nbsp;录</button>
		  </div>
		</div>

		<script>
		   // 去除浏览器控制台中的警告提示信息
		  域名uctionTip = false;

		  // 创建 vm 实例对象
		  const vm = new Vue({
			// 指定控制的区域
			el:\'#app\',
			data:{
			  unknown: \'login1\'
			},

			methods: {
			  changeLogin(){
				if( 域名own === \'login1\'){
				  域名own = \'login2\'
				}else{
				  域名own = \'login1\'
				}
			  }
			}
		   });
		</script>
	  </body>

image

image

需求2、现在class类名的个数、名字都不确定
image

  • 那么就继续改造
    image
点击查看代码

	<!DOCTYPE html>
	<html lang="en">
	  <head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title>2 - 数组写法</title>

		<script src="../../../js/域名"></script>

		<style>

			body {
			  background-image: url(../img/域名);
			  text-align: center;
			  background-size: 100% 100%;
			  height: 100%;
			  overflow: hidden;
			  background-repeat: no-repeat;
			  background-position: center;
			  background-attachment: fixed;
			}

			.top {
			  background: #ffffff2e;
			  width: 100%;
			  position: absolute;
			  bottom: 0;
			  line-height: 60px;
			  left: 0px;
			  right: 0px;
			  color: #fff;
			  text-align: center;
			  font-size: 16px;
			  font-weight: 600;
			}

			.basicLogin {
			  position: absolute;
			  top: 16%;
			  left: 28.5%;
			  width: 40%;
			  padding: 70px 2%;
			  text-align: center;
			}

			.login1 {
			  background: #ffffffd6;
			  border-radius: 2px;
			}

			.login2 {
			  background: rgba(0,0,0,.8);
			  box-sizing : border-box;
			  box-shadow: 0 15px 25px rgba(0,0,0,.5);
			  border-radius: 10px;
			}

			.title {
			  font-weight: 600;
			  font-size: 22px;
			  color: #0000FF;
			  margin-bottom: 40px;
			}

			.line {
				border-bottom: 1px solid #ffff;
				margin: 22px 1%;
				width: 96%;
			}

			.line input {
				border: none;
				padding: 0px 1%;
				margin: 1%;
				background: #ffffff14;
				width: 84%;
				font-size: 16px;
				line-height: 30px;
				outline: none;
			}

			.line .smallImg {
			  width: 26px;
			  float: left;
			  vertical-align: middle;
			  margin-top: 1px;
			}

			.logBut {
			  background: #7bb5ee;
			  padding: 10px 80px;
			  border: none;
			  color: #fff;
			  margin-top: 40px;
			  font-size: 16px;
			  cursor:pointer;
			}

		</style>
	  </head>

	  <body>
		<!-- 被 vm 实例所控制的区域 -->
		<div id="app">

		  <div class="top">&copy;紫邪情&nbsp;·&nbsp;用Java改变未来</div>

		  <div class="basicLogin" :class = "unknown" @click = "changeLogin">
			<div class="title">&copy;紫邪情&nbsp;·&nbsp;登录</div>
			<div class="line">
			  <img class="smallImg" src="../img/icon-域名" />
			  <input placeholder="请输入账号" type="text" />
			</div>
			<div class="line">
			  <img class="smallImg" src="../img/icon-域名" />
			  <input placeholder="请输入密码" type="password" />
			</div>
			<button type="button" class="logBut">登&nbsp;&nbsp;录</button>
		  </div>
		</div>

		<script>
		   // 去除浏览器控制台中的警告提示信息
		  域名uctionTip = false;

		  // 创建 vm 实例对象
		  const vm = new Vue({
			// 指定控制的区域
			el:\'#app\',
			data:{
			  unknown: [ \'login1\' , \'login2\' ]
			},

			methods: {
			  changeLogin(){

				const arr = [ \'login1\' , \'login2\' ];

				域名own = arr[ 域名r( 域名om() * 2 ) ]
			  }
			}
		   });
		</script>
	  </body>
	</html>

image

需求3、要绑定的class名字确定,但是:个数不确定,也需要动态绑定
image

image

class样式绑定小结

  • 1、字符串写法,适用于:class名字不确定时使用
  • 2、数组写法,适用于:class名字、个数都不确定时使用
  • 3、对象写法,适用于:class名字确定、但个数不确定( 如:例子中的login1可能用,可能不用,而login2也是一样,所以这就是各种组合 )
域名.2、style行内样式绑定 - 了解即可

image

image

class和style样式绑定小结

  • 1、class样式绑定
    • 写法 :class = "xxxx",其中xxxx可以使字符串、数组、对象
    • 字符串写法适用于:类名不确定、要动态获取( 交由Vue管理,随时调试 )
    • 数组写法:要绑定多个样式、class名字和个数都不确定
    • 对象写法:要绑定多个样式、class名字确定而个数不确定( 个数不确定是因为不知道某个样式用不用 )
  • 2、style样式绑定
    • 写法 :style = “xxx",其中xxx可以是对象、数组
    • 对象写法是推荐用的一种
  • 3、原则
    • 在Vue中静态不变的东西,就放在Vue模板中即可( 即:那个div容器中 ),而动态改变的东西就放在Vue实例身上

域名、条件渲染

域名.1、v-if
点击查看代码


	<!DOCTYPE html>
	<html lang="en">
	  <head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title>1 - v-if</title>

		<script src="../../js/域名"></script>
	  </head>

	  <body>
		<!-- 被 vm 实例所控制的区域 -->
		<div id="app">
			<!-- v-if和java中的if一样,只要结果为true就执行,为false就不执行
				所以:这里面不用true,用 1 === 1 也行,
				当然:使用v-bind绑定,写到data中,只要最后结果为boolean值即可
				相应地:有了v-if,那当然也有v-else-if、v-else( 不过这个有点特殊
				这是什么条件都不满足的时候,最终执行的[ 类似于java的try....catch....finally
				中的finally ]
			-->
			<div v-if = "true">
				<img :src="result" alt="不见了影响你开法拉利不?" :style="obj">
			</div>
		</div>

		<script>
		   // 去除浏览器控制台中的警告提示信息
		  域名uctionTip = false;

		  // 创建 vm 实例对象
		  const vm = new Vue({
			// 指定控制的区域
			el:\'#app\',
			data:{
				result: \'img/域名\',
				obj: {
					width: \'500px\',
					hight: \'500px\'
				}
			},
		   });
		</script>
	  </body>
	</html>

image

image

image

  • 注意:v-if、v-else-if、v-else组合用时,需要留意代码是紧挨着的即可,这就好比:java的Mybatis框架的pageHelper分页插件,用startPage和pageInfo联合使用一样( 数据查询完了之后放到pageInfo<>()中,这二者中间就不可以夹杂另外的语句,否则报错 )
域名.2、v-if配套工具template
  • 在弄这个之前,回到前面的v-if代码
    image

image

  • 所以:使用v-if和template改造
    image

image

域名.3、v-show
  • v-if会了,v-show就会了,用法和单纯的v-if一模一样
    image

  • 不过它和v-if的原理不一样
    image

image

v-if和v-show小结

  • 1、v-if
    • 写法
      • (1)、v-if = “表达式”
      • (2)、v-else-if = “表达式”
      • (3)、v-else = “表达式”
    • 适用于:切换频率较低的场景,因为:v-if是直接把不展示的DOM元素给移除掉
      image
    • 特点:不展示的DOM直接移除
    • 注意:v-if可以和v-else-if、v-else一起使用,但是:要求结构不可以被“打断”( 代码紧挨着 )
  • 2、v-show
    • 写法:v-show = “表达式”
    • 适用于:切换频率较高的场景
    • 特点:不展示的DOM元素未被移除,仅仅是使用display:none样式给隐藏掉了而已
  • 3、注意:使用v-if时,元素可能无法获取到,而使用v-show,则:一定可以获取到
    • 因为:v-show是做了样式修改,但是DOM节点还在,所以是可以操作这个DOM节点的,但是:v-if是直接把DOM元素给移除掉了( 万一是误操作而导致把v-if的值弄为false了,那后续万一其他地方用到了v-if移除的节点呢?不就裂开了吗 )

域名、列表渲染

域名.1、认识v-for
点击查看代码

	<!DOCTYPE html>
	<html lang="en">
	  <head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title>1 - 认识v-for</title>

		<script src="../../js/域名"></script>
	  </head>

	  <body>
		<!-- 被 vm 实例所控制的区域 -->
		<div id="app">
			<!-- 1、遍历数组 -->
			<h2>人员信息</h2>
			<!-- 简写形式 -->
			<ul>
				<li v-for = "p in persons" :key="域名">
					{{域名}} ----- {{域名}}
				</li>
				<!-- 
					v-for就和js中的for in差不多
					:key="域名"  此处:是给每一个li节点一个唯一的id( 和身份证号一样 就相当于是<li id = ‘xxx’> ),此时不写没事,但是最好都带上,后续有用
					p  代表的就是:从persons中遍历出来的每一条数据
				 -->
			</ul>

			<!-- 完整写法 -->
			<ul>
				<li v-for = "(val,index) in persons" :key="域名">
					{{域名}} ----- {{域名}} ------ {{index}}
				</li>
			</ul>


			<!-- 2、遍历对象 -->
			<h2>神奇之地</h2>
			<ul>
				<li v-for = "(val,index) in like" :key="index">
					{{val}} ------ {{index}}
				</li>
			</ul>

			<!-- 其实另外还有:v-for还可以遍历字符串、某个数字( 循环这个数字这么多次 ),但是这两种基本上都不用,所以不                
标签:vue编程
湘ICP备14001474号-3  投诉建议:234161800@qq.com   部分内容来源于网络,如有侵权,请联系删除。