vue系列

一、快速入门

1.使用vue的原因:页面交互多,,手动进行操作,代码难以维护。使用MVVM 框架能解决这个问题。
MVVM: view--ViewModel==Model
2. Vue的核心:通过尽可能简单的API实现相应数据绑定和组件的视图组件
数据驱动改变视图的自动更新;
视图组件化:将整个网页拆分成一个个区块,每个区块看做一个组件。
使用场景:项目中需要频繁操作DOM、多部分相同
二、快速安装(脚手架webpack工具)
1. 淘宝镜像 cnpm: https://npm.taobao.org/:下载淘宝镜像压缩包
$ npm install -g cnpm --registry= https://registry.npm.taobao.org
$cnpm install --global vue-cli
$vue init webpack my-project(项目名称)
安装依赖:$cd my-project
$npm install
$npm run dev
2. 数据驱动视图:
<div id="app">
hello {{name}} // 4.渲染
</div>
<script>
let vm = new Vue({   //创建一个实例    1.创建实例语法
el:"#app", //3. 挂载元素
data:{
name:"Mary" //2.设置数据
}
});
</script>
3.双向绑定:vue提供语法指令
<div id="app">
<input v-model="number">
<p>Number:{{number}}</p>
</div>
<script>
let vm=new Vue({
el:"#app",
data:{
number:"",
}
}),
</script>
4.  组件化:把页面中特定的区块独立抽出来,并封装成一个可方便复用的组件。
<div id="app">
<card></card>
<card></card>
<card></card>
</div>

<script>
//注册一个名叫card的组件,放在component文件夹中
Vue.component('card',{
template:`<div>
<img src="logo.png" alt="">
<h2>web</h2>
<p>describe</p>
<button>button</button>
</div>`
});

三、4个常用选项
1.filters过滤器
filters:{
    toInt:function(value){
        return parseInt(value);
    }
}
html中:
<div id="app">
num1:{{num1 | toInt}}<br>
num1:{{num1 | toInt}}<br>
num1:{{num1 | toInt}}
</div>

2.computed 计算属性
拿到数据,需要计算后得出属性:
let vm = new Vue({
///挂载元素
el:'#app',
//实例vm的数据
data:{
num1:1,
num2:3,
num3:6
},
//计算属性
computed:{
sum(){
return this.num1+this.num2+this.num3
}
}
});
<div id="app">
total:{{sum}}
</div>

3. methods方法
let vm = new Vue({
el:"#app",
data:{
a:0
},
//方法
methods:{
plus(){
return this.a++;
}
}
});
<div id="app">
{{a}}	
<button v-on:click="plus">add 1</button>
</div>
4.watch观察
Vue提供的用于检测指定数据发生改变的api
let vm = new Vue({
el:"#app",
data:{
a:0
},
//方法
methods:{
plus(){
return this.a++;
}
},

watch:{
a(){
     console.log('changed');
     console.log(this.a);
}
});

<div id="app">
{{a}}	
<button v-on:click="plus">add 1</button>
</div>


五、生命周期
1.beforeCreate:实力初始化后,数据观察和事件配置都没准备好
<div id="app">{{name}}</div>
<script>
let app=new Vue({
el:"#app",
 data:{
name:"前端“
},
beforeCreate(){
console.log('即将创建‘);
console.log(this.$data);
console.log(this.$el);
}
});
</script>


2 .created:beforeCreate之后的钩子。能读取到数据data的值,但是DOM还没生成,所以属性el还不存在,输出$data为一个object对象,而$el的值为undefined。
<div id="app">{{name}}</div>
<script>
let app=new Vue({
el:"#app",
 data:{
name:"前端“
},
beforeCreate(){
console.log('即将创建‘);
console.log(this.$data);
console.log(this.$el);
},
created(){
console.log('创建完毕');
conosle.log(this.$data);
console.log(this.$el);
}
});
</script>
3. beforeMount:挂载,$el不再是undefined,而是成功关联到我们指定的dom节点,但是name还没有成功渲染我们data中的数据。

<div id="app">{{name}}</div>
<script>
let app=new Vue({
el:"#app",
 data:{
name:"前端“
},
beforeCreate(){
console.log('即将创建‘);
console.log(this.$data);
console.log(this.$el);
},
created(){
console.log('创建完毕');
conosle.log(this.$data);
console.log(this.$el);
},
beforeMount(){
console.log('即将挂载');
console.log(this.$el);
}
});
</script>

4. mounted:挂载完毕,数据渲染成功


<div id="app">{{name}}</div>
<script>
let app=new Vue({
el:"#app",
 data:{
name:"前端“
},
beforeCreate(){
console.log('即将创建‘);
console.log(this.$data);
console.log(this.$el);
},
created(){
console.log('创建完毕');
conosle.log(this.$data);
console.log(this.$el);
},
beforeMount(){
console.log('即将挂载');
console.log(this.$el);
},
mounted(){
console.log('挂在完毕’);
console.log(this.$el);
}
});
</script>


5. beforeupdate:修改vue实例的data时,vue会自动更新渲染视图,在这个过程中,vue提供beforeUpdate的钩子给我们,在检测我们要修改数据的时候,更新渲染视图之前就会触发钩子beforeUpdate。
<div ref="app" id="app">   <!--ref用于获取dom-->
{{name}}
</div>

beforeUpdate(){
console.log('即将更新渲染‘);
let name = this.$refs.app.innerHTML;
console.log('name':+name);
},

6. updated:更新渲染视图之后,再读取


六、 在html中绑定数据

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>style绑定</title>
		<script src="../js/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<p :class="{'active':isActive}">This is binding class</p>
			<p :class="[activeClass,errorClass]">This is array style</p>
			<p :style="{color:colorStyle}">This is style</p>
		</div>
		<script>
			new Vue({
				el:"#app",
				data:{
					//isActive:true
					activeClass:'avitve',
					errorClass:'error',
					colorStyle:'red'
					}
					
			})
		</script>
	</body>
</html>


1.Mustache语法:{{}}
2.绑定纯html:带有html标签,不能用{{}}
<div id="app" v-html="name"></div>
<script>
let app=new Vue({
el:"#app",
data:{
name:"<strong>前端</strong>"
}
});
</script>

3.属性绑定:控制html标签的属性。使用v-bind绑定属性。(<a>的href标签,<img/>标签的src属性)
简写为 :href=“link” == v-bind:href"link"
4.支持javascript
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script src="../js/vue.js"></script>
	</head>
	<body>
		<div id="app">
			{{num+3}}
			{{ok?'yes':'no'}}
			<a :href="'http://'+host">baidu</a>
		</div>
		<script>
			let app=new Vue({
				el:"#app",
				data:{
					num:2,
					ok:true,
					host:"baidu.com"
				}
			});
		</script>
	</body>
</html>


加减乘除运算:<div id="app">{{num+3}}</div>;
三元运算:<div id="app">{{ok? 'yes':'no'}}</div>;
字符串拼接<div id="app"><a href="'http://'+host">hello官网</a></div>;

七、 十个指令
1. v-text:用于更新标签包含的文本,与双大括号效果相同。
2. v-html:绑定包含html代码的数据在视图上。
3. v-show:控制元素display css属性。
4. v-if指令:控制元素是否需要被渲染出来。
5. v-else:无对应值,但要求前一个兄弟节点必须使用v-if指令。
6. v-for:data中存放的数据不是简单的数字或字符串,而是数组Array类型。使用这个指令实现列表渲染。循环时加上index可以获取元素的索引。

7.v-bind:动态绑定DOM元素。
8. v-on:相当于绑定事件的监听器,绑定的事件触发了,可以指定事件的处理函数。
9. v-model:用于表单输入,实现表单控件和数据的双向绑定。
10. v-once:只渲染一次,后面元素中的数据再更新变化都不会重新渲染。
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>指令</title>
		<script src="../js/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<p v-text="msg"></p>
			<p>{{msg}}</p>
			<p v-html="htmlmsg"></p>
			<p v-show="show1">true</p>
			<p v-show="show2">false</p>
			<p v-if="if1">if:true</p>
			<p v-if="if2">if:false</p>
			<p v-else>else</p>
			<div v-for="item in list">{{item}}</div>
			<div v-for="(item,index) in list">{{index}}.{{item}}</div>
			<button v-on:click="say('Tom')">click</button>
			<input v-model="inputmsg" type="text" />
			<p>you input:{{inputmsg}}</p>
			<input v-once="oncemsg" type="text" />
			<p>you input:{{oncemsg}}</p>
		</div>
		<script>
			let app = new Vue({
				el:"#app",
				data:{
					msg:'hello world',
					htmlmsg:'<b>hello world',
					show1:true,
					show2:false,
					if1:true,
					if2:false,
					inputmsg:'',
					oncemsg:'hoho',
					list:['Tom','John','Lisa']
				},
				methods:{
					say(name){
						console.log('hello'+name);
					}
				}
			});
		</script>
	</body>
</html>



八、 组件

1.创建一个vue实例vm,挂载元素
在创建实例vm之前,利用vue提供的API来注册一个组件(Vue.component())。
使用组件。
数据动态展示:把数据存储在实例vm的data中
动态传参:使用props
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>组件</title>
		<script src="../js/vue.js"></script>
	</head>
	<body>
		<!--<script>
			Vue.component('my-component',{
				template:'<span>{{message}}</span>',
				data:{
					message:'hello'
				}
			})
			
		</script>-->
		<div id="example-2">
			<simple-counter></simple-counter>
			<simple-counter></simple-counter>
			<simple-counter></simple-counter>
		</div>
		<script>
			var data={counter:0};
			Vue.component('simple-counter',{
				template:'<button v-on:click="counter += 1">{{counter}}</button>',
				data:function(){
					return data
				}
			})
			
			new Vue({
				el:"#example-2"
			})
		</script>
	</body>
</html>


九、 实现vue组件之间的通信
1. 父组件——子组件
组件实例作用域相互孤立,所以子组件在模板template中不能引用父组件的数据。
使用props使子组件能够使用父组件数据。
1)创建容器
2)实例化
3)注册子组件
放在实例化之前,否则会报错
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>组件通信</title>
		<script src="../js/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<son :message="msg"></son>
		</div>
		<script>
			//父组件向子组件
			//注册子组件
			Vue.component('son',{
				props:['message'],
				template:`<div>{{message}}</div>`
			});
			const app = new Vue({
				el:"#app",
				data:{
					msg:"I am data of father component"
				}
			});
			
		</script>
	</body>
</html>



2 子组件到父组件
1)注册新组件:一个button,点击触发send方法,方法触发事件connect
2)在父组件中监听事件:connect触发的处理程序是say()方法
3)在实例中定义say()方法:
4)在子组件中定义数据
5)在父组件中say接受

3. 非父子组件通信:利用空vue实例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>组件通信</title>
		<script src="../js/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<son @connect="say"></son><!--v-on的缩写用@符号-->
		</div>
		
		<script>
			Vue.component('son',{
				template:`<button @click="send">
							Click
						  </button>`,
				data(){
					return{
						msg:' I am data of son'
					}
				},
				methods:{
					send(){
						this.$emit('connect',this.msg);//触发事件的API
					}
				}
			});
			
			const app=new Vue({
				el:"#app",
				methods:{
					say(msg){
						console.log(msg);
					}
				}
			});
		</script>
	</body>
</html>

九、 动态绑定class、style
1. 绑定class:
对象语法:动态绑定class是一个对象{},给class绑定一个对象:{'active:isActive},isActive是我们vm实例的数据,值为true。class的值最后被渲染成“active”,在对象中,若该属性对应的value为true,该属性会被渲染出来,为false,则不被渲染出来。
数组语法:class绑定值为一个数组,数组的元素,对应vm实例的数据data。

渲染时,activeClass和errorClass对应的值会被渲染成class

2. 绑定内联样式style
对象语法:


<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>style绑定</title>
		<script src="../js/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<p :class="{'active':isActive}">This is binding class</p>
			<p :class="[activeClass,errorClass]">This is array style</p>
			<p :style="{color:colorStyle}">This is style</p>
		</div>
		<script>
			new Vue({
				el:"#app",
				data:{
					//isActive:true
					activeClass:'avitve',
					errorClass:'error',
					colorStyle:'red'
					}
					
			})
		</script>
	</body>
</html>



十、transition组件过渡效果
1.transition组件起作用的情况:
 1. 条件渲染(使用v-if)
 2. 条件展示(使用了v-show)
 3. 动态组件
 4. 组件根节点
2.过渡原理:Vue自动嗅探目标元素是否应用了 CSS 过渡或动画,如果是,在恰当的时机添加/删除 CSS 类名。
1.v-enter:进入过渡效果(enter)刚刚开始那一刻。在元素被插入或者show的时候生效,在下一个帧就会立刻移除,一瞬间的事。
2.v-enter-active: 表示进入过渡(entering)的结束状态。在元素被插入时生效,在 transition/animation 完成之后移除。
3.v-leave: 离开过渡(leave)的开始那一刻。在离开过渡被触发时生效,在下一个帧移除,也是一瞬间的事。
4.v-leave-active:离开过渡(leaving)的结束状态。在离开过渡被触发时生效,在 transition/animation 完成之后移除。
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>transition</title>
		<script src="vue.js"></script>
	</head>
	<body>
		<div id="app" class="app">
		    <button class="btn" @click="showBox = !showBox">切换</button>
		    <div class="container">
		    	<transition name="box">
			    	<div v-show="showBox" class="box">
			    		I am the box
			    	</div>
			    </transition>
		    </div>
		 </div>
	</body>
	<script>
		const app = new Vue({
			el:"#app",
			data:{
				showBox:false
			}
		});
	</script>
	<style>
		.box{
			width:100%;
		    height:100%;
		    text-align: center;
		    line-height: 200px;
		    background: #ff8282;
		    color: #Fff;
		    /*以下两个默认值,可不写*/
		    /*写上只是为了便于讲解,记住这两个*/
		    opacity: 1;
		    margin-left: 0;
		}
		.box-enter-active,.box-leave-active{
		    transition: all .8s;
		 }
		 .box-enter{
		    opacity: 0;
		    margin-left: 100%;
		 }
		 .box-leave-active{
		    opacity: 0;
		    margin-left: 100%;
		 }
	</style>
</html>

当它进入过渡的时候(隐藏→显示),就会依次发生:
    1. 添加.box-enter
    2.  删除.box-enter,添加 .box-enter-active
    3.  删除.box-enter-active
当它离开过渡的时候(显示→隐藏),就会依次发生:
    1. 添加.box-leave
    2. 删除.box- leave,添加 .box- leave-active
    3. 删除.box- leave -active

注意:vue要升级到2.0,否则不支持这些。



十一、 vue-router
Vue.js的官方路由插件,和vue.js深度集成,适合用于构建SPA单页面应用。通过将网页应用做成单页面应用,用视图切换隐藏和显示能够模拟页面切换。提供<router-link/>, <router-view/>两个新组件。
1.引入vue.js, vue-router.js
2.<router-view>渲染匹配到的视图组件(<router-link>指向的目标地址)
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>vue-router</title>
		<script src="vue.js"></script>
		<script src="vue-router.js"></script>
	</head>
	<body>
		<div id="app">
			<div class="nav">
				<!----to指定链接---->
				<router-link to="/vue">
					vue
				</router-link>
				<router-link to="/react">
					react
				</router-link>
				<router-link to="/angular">
					angular
				</router-link>
			</div>
			<div class="content">
				<router-view></router-view>
			</div>
		</div>
	</body>
	<script>
		const vueComponent = {
			template:`<div> this is vue </div>`
		};
		
		const reactComponent = {
			template:`<div> this is react </div>`
		};
		
		const angularComponent = {
			template:`<div> this is angular </div>`
		};
		
		//关联导航地址和组件
		const router = new VueRouter({
			routes:[
			   {
			   	path:"/vue",
			   	component: vueComponent
			   },
			   {
			   	path:"/react",
			   	component: reactComponent
			   },
			   {
			   	path:"/angular",
			   	component: angularComponent
			   }
			]
		});
		
		//创建vue实例,注入路由router
		const app = new Vue({
			el: "#app",
			router
		})
	</script>
</html>

十二、Vuex
Vuex是一个专为Vue开发的应用程序的状态管理模式,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
就是用来管理所有组件公共数据的一个仓库。一旦一处改变,所有地方的这个数据都会改变。
1.创建仓库Store,用来对状态进行管理
2. 三个核心概念:
1)State:Vuex 使用单一状态树,用一个对象State包含了整个应用层级的所有状态,你可以理解为这些状态就是一堆全局变量和数据。这个数据可以作为全局的key value
//创建一个 store
 const store = new Vuex.Store({
    //state存储应用层的状态
    state:{
        count:5  //总数:5
    }
 });
2)Getters:类似vue中的computed,需要在state的基础上派生一些状态时使用getters。
const store = new Vuex.Store({
   //state存储应用层的状态
   state:{
      count:5  //总数:5
    },
    //派生出来的状态
   getters:{
      //ES6 的箭头函数语法
    newCount:state => state.count * 3
    }
 });
3)Mutations:修改仓库store中状态的唯一方法。
const store = new Vuex.Store({
    //state存储应用层的状态
    state:{
        count:5  //总数:5
    },
    //更改store状态的唯一途径
    mutations:{
        increment(state){
            state.count ++;
        }
    }
 });

3.实现计算器:
1)安装vuex
2)创建仓库store:
3)定义组件:16个键键值放入vue实例的data中
4)页面布局:
5)创建vue实例
const app = new Vue({
    //挂载元素
    el:"#app",
 });
6)加入16键的键值
7)利用vue提供的v-for指令和 <keyboard/> 组件,实现键盘区域的渲染。
<div class="list">
<!--键盘区-->
<keyboard v-for="item in keys" :value="item">
</keyboard>
</div>
8)这个时候result和enter是应用层状态,定义在store上。将store和vue关联起来。Vuex提供了store选项,允许我们将仓库store引入到根组件,并且此跟组件的所有子组件都可以使用到仓库store,而且子组件无需显示的引入。
这样可以通过this.$store访问到它。
将store引入后,state中的应用层数据result和enter可以被使用。因为计算结果result和输入值enter经常会被 <keyboard/> 组件操作更新,所以我们这里需要使用Vue的computed计算属性。将store状态关联到实例中的计算属性result和enter。仓库中值变化,实例会随之变化。
9)将result和enter绑定
10)修改组件,点击键盘时提交mutation,并把当前按键值传过去。
11)在仓库中定义名为calculation的mutation。
5. 总流程图




代码的github地址:https://github.com/YZlingyu/Vue-basic-learning
这个是前端教程公众号Vue的学习笔记

感觉作者写的很好,就在这整理一下学习笔记。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值