Vue.js基础教程

Vue.js基础教程一、简单介绍是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue也完全能够为复杂的单页应用提供驱动。二、优点三、安装与部署直接script标签引入<scriptsrc=”https://cdn.jsdelivr.net/npm/vue/dist/vue.js”></script>通过

一、简单介绍

是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

二、优点

在这里插入图片描述

三、安装与部署

  1. 直接script标签引入
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  2. 通过NPM下载
    $ npm install vue
  3. 通过命令行工具(CLI)
    Vue 提供了一个官方的 CLI,为单页面应用 (SPA) 快速搭建繁杂的脚手架。它为现代前端工作流提供了 batteries-included 的构建设置。只需要几分钟的时间就可以运行起来并带有热重载、保存时 lint 校验,以及生产环境可用的构建版本

四、创建第一个vue应用

<html>
	<head>
	<meta charset="utf-8">
	<title></title>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>   //这里用cdn的地址引入vue
	</head>
	<body>
		<div id="app">
	  	{
  
  { message }} {
  
  {name}}    //引用message和name变量,这个{
  
  {}}是插值表达式
		</div>
	
	<script type="text/javascript">
		var app = new Vue({       //只要引入vue.js就会产生一个Vue函数,这里通过new创建了一个vue实例应用对象app
			el: '#app',          	//挂载点 id为app的元素
			data: {                  //数据管理
				message: 'Hello Vue!',
				name : "Vue"
			}
		});
	</script>
</body>
</html>

五、挂载点(el)

针对上述的简单例子,我们不禁会有几个关于挂载点的小问题?

1. Vue实例的作用范围是哪个呢?

 答:Vue会管理el选项命中的元素及其内部元素

2. 是否可以使用其他选择器?

答:可以使用其他选择器,但是建议使用id选择器

3. 是否可以设置其他的Dom元素呢?

答:可以使用其他的双标签,但是记住,不能挂载到html和body标签上,会报错

六、data数据对象

Vue中用到的数据定义在data中,data可以写复杂类型的数据,渲染复杂类型的数据时 ,只要符合js预发即可

七、Vue常见指令(即元素内部的属性)

  • v-text

1、v-text的作用是:设置标签的文本内容(textContent)
2、默认写发会替换掉全部的文本内容,如果想要实现局部替换,则使用插值表达式的形式{
{}}

3、例子:<div v-text='message'></div> //data中的message属性值会插入到div中作为其文本内容

  • v-html

1、用法和v-text相似,作用是:设置元素的innerHTML
2、区别就是v-text只会解析文本内容,然后插入到对应元素内部,但v-html如果引用的值是一个html标签结构的,v-html就会将其解析成html,然后插入到对应元素内部

在这里插入图片描述

  • v-on

v-on是为元素绑定事件的,它有一种简写方式@(v-on:===@),事件写在与el、data同级的methods对象中

在这里插入图片描述

这里还要提到一个事件修饰符(.修饰符),事件后面跟上.修饰符可以对事件进行限制,举个例子,@.entry=“xxx”,这样写只有按entry键才能触发xxx函数

  • v-show

它是用来控制元素的显示状态,它的本质是修改元素的display,实现显示隐藏,指令后面的内容最终都会解析为布尔值

  • v-if

它也是用来控制元素的显示状态,它的本质是通过操纵dom元素来切换显示状态,表达式为true时,元素存在于dom树中,false时从dom树中移除

  • v-bind

作用:为元素绑定属性,完整写法v-bind:属性名,简写:直接省略v-bind,直接:属性名
注意:它只能实现数据的单向绑定,只能从M(model)->V(vi)

  • v-for

作用:根据数据生成列表结构,数组经常和v-for一起使用,预发是(item,index)in 数组数据,item和index可以结合其他指令一同使用
在这里插入图片描述

  • v-model

该指令可以实现表单元素和Model中数据的双向绑定,但是要注意,它只能用在表单元素中(input、select、checckbox、textarea这些)

Demo:inout中输入改变,也会同步影响data中的值,值改变了也会同步影响第一行引用message的显示
在这里插入图片描述

八、vue中使用样式

1.使用class类名样式
List item
2.使用内联样式

在这里插入图片描述

九、过滤器

vue中允许你自定义过滤器,用于一些常见文本的格式化,它只能用于两个地方插值表达式({
{}})和v-bind表达式中,一般分为两种(私有和全局)

9.1、全局过滤器

定义方式:

Vue.filter('过滤器名称',function(data){      //直接用Vue来定义filter,所有的实例对象都能用
	return "新的处理后的内容"
})

调用方式:

{
  
  { name | 过滤器名称 }}    //这段代码的意思就是说,原先引用的是name变量的值,他会经过过滤器的处理,返回的新的结果作为此处的最终结果

注意:调用过滤器的时候还可以给过滤器传参,放到过滤器定义时的函数的第二个形参位置,因为第一个默认是过滤器 | 符号前的变量值

9.2、私有过滤器

定义方式:

const vm2 =new Vue({
	el:"#app",
	data:{...}
	methods:{...}
	filters:{
		过滤器名称:function(){
			....
		}
	}
})

调用方式: 同上。。。

十、自定义指令

10.1、全局自定义指令

定义方式:


Vue.directive('自定义指令名称',{
	bind:function(el){...}       // 每当指令绑定到元素上时会立即执行该函数,只执行一次,但此时还没插入到DOM树中
	inserted:function(el){...}   //元素插入到DOM中时执行,只执行一次
	update:function(el){...}    //所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新
	componentUpdated:function(){...}  //指令所在组件的 VNode 及其子 VNode 全部更新后调用。
	unbind:function(){...}   //只调用一次,指令与元素解绑时调用。
})

//每个函数中的第一个参数永远是el,表示被绑定了指令的那个元素

使用方式:

在你绑定的元素上用v-加上你自定义的指令名称:<input v-focus>

10.2、私有自定义指令

定义方式:

directives: {          //也是和上述定义私有过滤器一样写在实例的directives属性中
  focus: {
    bind:function(el){...}       
	inserted:function(el){...} 
	update:function(el){...}  
  }
}

10.3、钩子函数参数

指令钩子函数会被传入以下参数:

el:指令所绑定的元素,可以用来直接操作 DOM。
binding:一个对象,包含以下 property:

  • name:指令名,不包括 v- 前缀。
  • value:指令的绑定值,例如:v-my-directive=“1 + 1” 中,绑定值为 2。
  • oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
  • expression:字符串形式的指令表达式。例如 v-my-directive=“1 + 1” 中,表达式为 “1 + 1”。
  • arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 “foo”。
  • modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }。
  • vnode:Vue 编译生成的虚拟节点。移步 VNode API 来了解更多详情。
  • oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

除了 el 之外,其它参数都应该是只读的,切勿进行修改。如果需要在钩子之间共享数据,建议通过元素的 dataset 来进行。

10.3、函数简写

在很多时候,你可能想在 bind 和 update 时触发相同行为,而不关心其它的钩子。比如这样写:

Vue.directive('color-swatch', function (el, binding) {     //直接在定义指令后跟函数,而不是上面的对象
  el.style.backgroundColor = binding.value
})

十一、vue实例的生命周期

11.1、创建期间的生命周期

  • beforeCreate
  • created
  • beforeMount
  • mounted

11.2、运行期间的生命周期

  • beforeUpdate
  • updated

11.3、销毁期间的生命周期

  • beforeDestroy
  • destroyed
    在这里插入图片描述

十二、Vue过渡&动画

12.1、使用过渡类名实现动画

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<!-- <script src="vue.js" type="text/javascript" charset="utf-8"></script> -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	<style>           //直接定义两个不同阶段的类名来控制实现动画
		.v-enter,.v-leave-to{        
			opacity: 0;
		}
		.v-enter-active,.v-leave-active{
			transition: all 1s ease;
		}
	</style>
</head>
<body>
	<div id="app">
	  <input type="button" value="点我" @click="flag=!flag"/>
	  
	  <transition >      //transition标签是vue官方提供的,将要动画的元素包裹住
		  <div v-if="flag">你好</div>
	  </transition>
	 
	</div>
	
	<script type="text/javascript">
	var app = new Vue({
		el: '#app',
		data: {
			flag : false
		}
	});
	</script>

</body>
</html>

12.2、自定义动画的类名前缀(v-)

	<style>      
		.my-enter,.my-leave-to{ //这里的类名前缀就不用写v-,和transition中name属性值保持一致
			opacity: 0;
		}
		.my-enter-active,.my-leave-active{
			transition: all 1s ease;
		}
	</style>

	<transition name="my">    //给transition标签添加一个name属性来自定义动画类名前缀
		<div v-if="flag">你好</div>
	</transition>
		

十三、组件

13.1、什么是vue组件:

vue中的组件的出现是为了拆分Vue实例的代码量的,能够让我们以不同的组件来划分不同的功能

13.2、创建组件的方式

  • 方式一(全局组件)
<body>
	<div id="app">
	 <!-- <input type="button" value="点我" @click="flag=!flag"/>
	  
	  <transition >
		  <div v-if>你好</div>
	  </transition> -->
	  <my-com1 />   //直接用标签的形式使用自定义组件
	 
	</div>
	
	<script type="text/javascript">
		
	// 使用Vue.extend()来创建全局的vue组件
	const com1 =Vue.extend({
		template:"<h1>哈哈哈啊哈哈哈</h1>"   //通过template属性指定组件要展示的html结构
	})	
	
	Vue.component('myCom1',com1)   //用Vue.component定义全局组件,第一个参数是自定义组件名称,第二个是刚创建出来的组件模板对象
	
	var app = new Vue({
		el: '#app',
		data: {
			flag : false
		}
	});
	</script>
</body>

注意:如果在定义组件的时候,写的自定义组件名称是驼峰形式的,如上面那样,那么你在调用组件时要小写并以-连接,如果没有驼峰形式的,直接原样调用即可

  • 方式二(全局组件)
	//直接在组将注册方法中,第二个参数中传入一个对象,template属性还是一样定义组件的html结构
	
	Vue.component('myCom1',{
		template:"<h2>12312312312321</h2>"
	}) 

缺点:html结构如果有嵌套,这样写成字符串形式太麻烦了,不便于开发书写

  • 方式三(全局组件)
	<div id="app">
	  <my-com1 />   //直接用标签的形式使用自定义组件
	</div>
	
	//直接在控制元素外面定义个模板,这样便于开发者书写,有提示
	<template id="temp">
		<div>
			<h1>
				1111
			</h1>
			<span>
				2222
			</span>
		</div>
	</template>
	
	Vue.component('myCom1',{
		template:"#temp"   //template原先的手写字符串替换成外面定义的模板元素,id要一致
	}) 

  • 方式四(私有组件)
	//定义组件模板接口
	<template id="temp">
		<div>
			<h1>
				1111
			</h1>
		</div>
	</template>
	
	var app = new Vue({
		el: '#app',
		data: {
			flag : false
		},
		components:{     //私有组件还是在实例对象中添加components属性
			组件名称:{
				template:"#temp"
			}
		}
	});

13.3、组件中的data

	<template id="temp">
		<div>
			<h1>{
  
  {name}}</h1>    //调用组件自身的data数据,调用方式和实例的data一样
		</div>
	</template>
	
	<script type="text/javascript">
	
	Vue.component('myCom1',{
		template:"#temp",
		data:function(){    //可以在组件注册时声明data属性,这个data必须是一个函数,而且必须返回一个对象
			return{
				name:'haha'
			}
		}
	}) 

13.4、实现组件中切换

//component是Vue的一个占位符,:is属性用于确定要展示的组件名称
//如果要实现不同条件下展示不同的组件,只需要变量控制:is后面的值即可

<component :is="'myCom1'"></component>   

13.5、组件间传值

  • 父组件向子组件传值
//父组件上用属性绑定的方式(v-bind)给子组件传递数据
<div id="app">                          //这里实例控制的div相当于父组件
	<com1  v-bind:parentData="msg"/>    //这个msg是父组件data中的数据
</div>

<script>
	var app = new Vue({             
		el: '#app',
		data: {
			msg: false    
		},
		components:{
			com1:{
				template: '<h1> {
  
  { parentData }} </h1>'      //定义后这里才能使用
			}
		},
		props:[ ' parentData' ]   //要使用父组件传的数据,需要在props的数组中定义下
	});
</script>

注意:props中的数据是只读的,而组件自身内部的data是可读可写的

  • 父组件向子组件传递方法
<div id="app">                 
	<com1  v-on:focus="show"/>    //通过事件绑定方式去传递父组件的show方法,简写	@focus
</div>

<template id="haha">
	<input type="button" @click ='myClick'>点我</input>  //子组件点击时调用自身的方法myClick
</template>

<script>
	var app = new Vue({             
		el: '#app',
		data: {
			msg: false    
		},
		components:{
			com1:{
				template: '#haha'   
				methods:{
					myClick(){             //通过$emit触发父组件穿过来的方法focus
						this.$emit('focus')
					}
				}
			}
		},
		methods:{
			show(){
				console.log(1111)
			}
		}
	});
</script>
  • 子组件向父组件传递数据
<div id="app">                 
	<com1  v-on:focus="show"/> 
</div>

<template id="haha">
	<input type="button" @click ='myClick'>点我</input>  //子组件点击时调用自身的方法myClick
</template>

<script>
	var app = new Vue({             
		el: '#app',
		data: {
			msg: false    
		},
		components:{
			com1:{
				template: '#haha'   
				methods:{
					myClick(){          //调用父组件传过来的方法的同时还可以向父组件传递数据
						this.$emit('focus',2222,3333)
					}
				}
			}
		},
		methods:{
			show(val1,val2){              //父组件中通过函数形参来拿到子组件传递过来的数据
				console.log(val1,val2)    // 输出 2222,3333
			}
		}
	});
</script>

13.6、通过ref获取dom元素和组件引用

直接在想要获取的dom元素和组件上写上ref属性,获取通过this.$refs就能获取,这样就不用操作dom就你能获取对应元素了

十四、路由(vue-router)

14.1、安装

1、直接下载 / CDN

https://unpkg.com/vue-router/dist/vue-router.js

Unpkg.com 提供了基于 NPM 的 CDN 链接。上面的链接会一直指向在 NPM 发布的最新版本。你也可以像 https://unpkg.com/vue-router@2.0.0/dist/vue-router.js 这样指定 版本号 或者 Tag。

在 Vue 后面加载 vue-router,它会自动安装的:

<script src="/path/to/vue.js"></script>
<script src="/path/to/vue-router.js"></script>

2、NPM下载安装

npm install vue-router

如果在一个模块化工程中使用它,必须要通过 Vue.use() 明确地安装路由功能:

import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter)

14.2、使用

1、导入包文件

<script src="./lib/vue-router-3.0.1.js"></script>

2、定义不同组件

const login ={
	template:"<h1>我是登录组件</h1>"
}

const register={
	template:"<h1>我是注册组件</h1>"
}

3、创建路由对象,当导入vue-router包文件后,在全局window对象中就会有一个路由构造函数,叫做VueRouter,在new的时候可以给构造函数传递一个配置对象

const routerObj =new VueRouter({
	routes:[             //路由规则
		{path:'/login',component:login},
		{path:'/register',component:register}
	]
})

4、关联实例,注册路由对象

const vm =new Vue({
	el:"#app",
	data:{},
	methods:{},
	router:routerObj     //将路由对象注册到实力上,用来监听url地址,然后展示对应的组件
})

5、在视图层(实例关联的元素上占位,用于显示路由匹配的组件)

<div id="app">                 
	<router-view></router-view>  //这是vue-router提供的标签,专门用来占位的,将来路由匹配到的组件就会放到这里显示
</div>

14.3、router-link的使用

以前用自己写的a标签超链接实现路由跳转

<a href=“#/login” >跳转登录组件</a>
<a href=“#/register” >跳转注册组件</a>

vue-router有提供一个router-link标签,默认渲染为a标签

<router-link to=“/login” >跳转登录组件</router-link>
<router-link to=“/register”” >跳转注册组件</router-link>

14.4、redirect重定向的使用

// 通常用于初始的根目录的重定向
routes:[  
	{path:'/',redirect: "/login"}    
	{path:'/login',component:login},
	{path:'/register',component:register}
]

14.5、路由传参

1、使用query(查询字符串)方式传递参数

<router-link to=“/login?age=123” >跳转登录组件</router-link>

注意:这种方式传递参数不需要修改路由匹配规则,如果你要拿到传递的参数,可以在组件内部通过this.$route.query组件实例上获取

2、使用params方式传递参数

<router-link to=“/login/123” >跳转登录组件</router-link>   //这边直接按匹配规则来传参

routes:[      
	{path:'/login/:id',component:login},  //这边路由匹配规则中通过占位符来匹配对应路由参数
]

注意:如果想要得到传递的id:123,可以通过this.$route.param获取

14.6、路由嵌套

//如果想要再login登录组件中又生成一个二级路由/login/account1和/login/account2

const router= new UseRouter({
	routes:[
		{ 
			path:'/login',
			component:login,
			children:[    //需要在一级路由的children属性中定义路由规则
				{ path:'account1',component:account1 }, 
				{ path:'account2',component:account2 }
			]
		}
		{ path:'/register',component:register}
	]
})

14.7、使用命名视图实现经典布局(头部+侧边栏+主体)

//视图区还是设置3个坑来显示,但是使用name属性说明这个坑就只显示对应name的组件
<div id="app">
	<router-view></router-view>
	<router-view name="leftCom"></router-view>
	<router-view name="rightCom"></router-view>
</div>

const header = {
	template:"<h1>我是header组件</h1>"
}
const leftCom= {
	template:"<h1>我是左侧侧边栏组件</h1>"
}
const rightCom= {
	template:"<h1>我是主体区组件</h1>"
}

const router =new VueRouter({
	routes:[
		{path:"/",components:{     //这里的路由规则中匹配到/时可以同时显示多个组件,每个组件有key,要和视图区的坑的name对应
			"default":header,
			"leftCom":leftCom,
			"rightCom":rightCom
		}}
	]
})

//布局的样式文件忽略。。。。。

十五、实例属性-watch

1、使用watch来监听data中变量的变化

//通过点击事件来改变data中的flag变量值,用watch来监听flag的值
<body>
	<div id="app">
	  <button type="button" @click="change">点我改变</button>    
	  <h1>{
  
  {flag}}</h1>
	</div>
	
	<script type="text/javascript">
	
	
	var app = new Vue({
		el: '#app',
		data: {
			flag: false
		},	
		methods:{
			change:function(){
				this.flag=!this.flag
			}
		},
		watch:{       //data中的flag变量值变了,会触发该函数
			flag:function(){
				console.log("flag发生改变了")
			}
		}
	});
	</script>
</body>

2、watch监听路由地址的变化

watch:{
	‘$route.path’:function(){      //直接监听$route
		console.log('路由发生改变了')
	}
}

十六、实例属性-computed

在computed中可以定义一些属性,这些属性叫做【计算属性】,计算属性的本质其实是一个方法,只不过我们在使用这些计算属性的时候,是把他们的名称直接当成属性来使用,而不是当做方法去调用

注意:
1、计算属性 在引用的时候一定不要加()去调用,直接把他当成普通的属性(变量)去使用
2、只要 这个计算属性内部有用到data中的数据,而且这些data数据发生了改变,就会触发该计算属性(该方法),也就是会立即重新计算这个计算属性的值
3、计算属性的值会被缓存起来,方便下次直接使用
4、在计算属性的函数中一定要return 值

十七、watch、methods、computed之间的区别

  1. computed:属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算属性,主要用作普通属性来使用,而不是方法
  2. methods:方法表示一个具体的操作,主要用来些业务逻辑的
  3. watch:一个对象,键是需要监听的表达式,值是对应回调函数,主要用来监听某些特定数据的变化,从而进行某些具体的业务逻辑操作,可以看作是computed和methods的结合体

十八、页面使用render渲染组件

const login ={
	template:"<h1>我是登录组件</h1>"
}

const vm =new Vue({
	data:{},
	methods:{},
	render:function(createElements){  //createElement是一个方法,调用它,会把指定的组件模板渲染为html结构
		return createElements(login)  
	}
})

注意:这种render方式渲染组件,这个return 返回的组件内容会替换掉上面el挂载的那个元素(整个替换),不想以前那种通过component形式渲染组件,那个只是在对应位置放了一个组件而已,不影响div中其他存在的元素

十九、webpack中导入Vue

1、回顾下,页面中是如何导入Vue的?

//直接通过script标签导入
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

2、webpack中导入Vue

  1. 方式一
//先通过npm下载Vue包
npm i vue --save

//然后通过import导入,但是这样的方式导入需要注意,这样导入的vue的构造函数功能并不齐全,只提供了runtime-only的方式,所以如果想要直接import导入,可以通过相对路径去导入对应的完整vue包文件
import Vue from vue   //x
import Vue from "../node_modules/vue/dist/vue.js"  //√,引入完整功能的vue.js文件
  1. 方式二

如果我就想直接通过import直接引入怎么办?

import Vue from "vue"  //引入方式不变

但需要在webpack.config.js配置文件中去修改vue包文件的路径,增加resolve属性,vue$的意思是:当遇到vue结尾的文件导入时,去右侧的指定路径去找
在这里插入图片描述

二十、webpack页面中导入自定义组件(.vue文件)

1、先单独定义login.vue组件文件

<template>
	<h1> login组件 </h1>
</template>

<script>  //组件的逻辑代码
	.....
</script> 

<style>   //组件样式
	....
</style>

2、页面中导入

import login from './login.vue'

3、由于webpack默认解析不了vue文件格式,所以需要再下载对应的loader

npm i vue-loader vue-template-compiler -S

4、然后再Vue实例中通过render属性渲染组件(webpack中不能用components的方式渲染组件)

今天的文章Vue.js基础教程分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/29161.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注