Vue2基础操作1

133 阅读6分钟

vue介绍:

构建数据驱动的web引用开发框架,属于前端框架。(vue几乎不会用DOM操作)

为什么如此受欢迎?

1、声明式渲染,因对前后端分离开发大趋势

2、渐进式框架,适应各种业务需求以及各种场景(从小到大都可以省略)

3、更适合做移动端开发,SPA页面(单页面开发)- 效率更高

4、快速交付,结合第三方UI框架组件库进行快速开发 - 比如elementUI、VantUI

5、企业需求,必备技能(vue、react)

6、中国自己的框架(借鉴了react和angular)

vue是一个属于mvvm架构的框架:什么是mvvm?

m - model:模型数据

v - view:视图

vm - ViewModel控制器

我们一般都统称为mv*架构:mvc、mvp、mvvm

开发环境搭建:两种方式

1、下载引入:vue.js

2、vue-cli - 脚手架 - 新手不推荐


vue2开发

模板

var vueName=new Vue({
		el:"#box",//只有在id为box的div里才可以使用vue的语法
		data:{//这里面放的是变量
			变量名: 值,
		},
		methods:{//这里面放的是函数
			函数名(){
				操作
			},		
		},
                computed:{//计算属性(节约调用次数)
			函数名(){
				return 结果;
                        }
                },
                watch:{ //监听
			变量名(new,old){
			}
		}
	})
 console.log(vueName)

计算属性

var vm=new Vue({
		el:"",//挂在页面元素
		data:{},//模型数据
		methods:{},//放函数
		computed:{
			函数名(){
				return 结果;
//注意此部分叫做计算属性,很像一个函数,但是必须加return返回值,而且在使用时不能加()调用
//虽然看上去更加麻烦了,但是js中就应该放入逻辑,HTML上不推荐
//但是methods调用几次就会执行几次,但是computed调用多次只要数据不变的情况下只会执行一次
//methods可以说是专门为事件准备的,computed不能绑定在事件上,那他用来干什么?
//只要以后有跟计算相关的都放到computed里面 - 【重在结果】
			}
		},
	})

监听属性:

var vm=new Vue({
		el:"",//挂在页面元素
		data:{},//模型数据
		methods:{},//放函数
		computed:{},
		watch:{
			变量名(new,old){
 //监听,能时刻监听到数据的变化,甚至是异步数据,比如:input不需要再用@input事件了	
			}
		}
	})

方法methods->事件绑定,不可以用return

计算computed->重视结果,解决模板过重的问题,必须要有return,只求结果,不支持异步,只能同步!

监听watch->重视过程,监听一个值的改变,不用返回值,支持异步的

插值表达式:{{变量}}

  • 在HTML上实现了一个基本的js环境,可以进行js运算、放入变量、三目运算、API操作...

vue的指令:在HTML上写着v-xxx的特殊属性

  • v-html:底层就是innerHTML,做了简化操作,可以渲染标签,其实就是添加了内容

比如:<elem v-html="变量"></elem>

  • v-for:底层就是for in循环,做了简化操作,可以遍历数组

比如:<elem v-for="(v,i) in 数组名">{{v}}</elem>

会根据数组渲染出多个元素,拥有下标和值,

渲染时配合:key="v" 其中的值一般用id或该循环的对象v,不要用下标,下标会随数组变化,不唯一

  • v-modal:具有双向数据绑定功能,页面可以控制变量,变量也可以控制页面

比如:<input v-modal="变量名"> input的默认值就为此变量,并且input修改内容,变量也会跟着一起变化

  • v-show:隐藏和显示, 传入的是一个布尔值,根据你的布尔值进行显示隐藏,如果为true则显示,如果为false则隐藏,底层:设置display为none/block

  • v-if是否渲染页面,传入的是一个布尔值,根据你的布尔值进行显示隐藏,如果为true则显示,如果为false则隐藏,底层:appendChild/remove

比如:<elem v-show/if="布尔值"></elem>

  • v-bind:属性名 - 操作动态的属性:简写为:属性名

<a :class="变量" :href="变量"></a>

  • v-on:事件名 - 绑定事件,简写为:@事件名="函数名" <a @事件名="函数名"></a>

vue2的操作样式

class操作样式:

<div :class="obj">文字</div> - 对象口味的语法糖通过下方代码,最终class有aa和bb为true,则带有此class,cc为false说明不需要

<div :class="arr">文字</div> - 数组口味的语法糖通过下方代码,最终class有aa和cc

new Vue({
	el:"#box",
	data:{
            obj:{ - 样式class对象口味写法
                aa:true,
		bb:true,
		cc:false,
                //注意后续不能用js直接添加dd,不能直接追加新属性和值,
                //vue底层具有拦截机制,想要添加:Vue.set(vm对象.obj,"dd",true);
            },
            arr:["aa","cc"]
            //样式class数组口味写法,可以随便的添加和删除,更加的随意简单:vm对象.arr.push("dd");
            },
	methods:{
        }
			})

style内联样式操作

<div :style="obj">文字</div> - 对象口味的语法糖通过下方代码,最终style内联样式,要有的内容需要搭配下面的代码

<div :style="arr">文字</div> - 数组口味的语法糖通过下方代码,最终style内联样式

var vm=new Vue({
		el:"#box",
		data:{
			obj:{
				background:"red",
				width:"300px",
				height:"300px",
				border:"1px solid #000",
				borderRadius:"50%",
				overflow:"hidden" 
                                //注意后续不能用js直接添加新样式,不能直接追加新属性和值,vue底层具有拦截机制,想要添加:Vue.set(vm对象.obj,"css属性名","css属性值");
			},
			arr:[
				{background:"red",},
				{width:"300px",},
				{height:"300px",},
				{border:"1px solid #000",},
				{borderRadius:"50%",},
				{overflow:"hidden"}, 
                                //样式class数组口味写法,可以随便的添加和删除,更加的随意简单:vm对象.arr.push({"属性名","属性值"});
			]
		},
		methods:{

			}
			})

条件渲染:就是v-if的升级版

<ul>
				<li v-for="v in datalist">{{v.name}} - 
					<span v-if="v.state===0">未付款</span>
					<span v-else-if="v.state===1">待发货</span>
					<span v-else-if="v.state===2">已发货</span>
					<span v-else>已完成</span>
				</li>
			</ul>

通过这些代码,我们可以实现根据json数据渲染页面,并且判断状态的不同显示不同的span文字

列表渲染(v-for):

        <ul>
            <li v-for="v in 数据名" :key="v.id">{{v}}</li> 
            //遍历数字基本没有意义,不管是遍历对象还是数组,前面始终是值,后面始终是下标
	</ul> 

虚拟DOM:数据->vue变为虚拟DOM:JS对象描述的一个节点,然后再和真实DOM进行比较,考虑要不要替换真实DOM->真实DOM

新的数据会生成新的虚拟DOM,然后VUE底层会使用diff算法拿着新的虚拟DOM和老的对象,找不同

找到不同后,会更新出一个补丁,渲染到真实DOM之中,这样的好处就是代价更小(性能)

为什么说虚拟DOM代价更小呢,因为真实DOM非常复杂,有很多很多的属性,但是虚拟DOM只需要重要的属性就够了

  • 理想情况:key="v.id",千万不要用下标当做key

  • 目的:高效复用DOM

  • 面试题:为什么li要添加key?

数组更新检查:

1、以下方法操作数组,可以检测变动:- 强烈推荐

push/pop/unshift/shift/splice/sort/reverse

2、filter/concat/slice/map - 不会修改原数组,会返回一个新数组,我们可以用新数组再去【覆盖】原数组 - 一般般

3、不能和检测以下变动的数组

arr[下标]=新值;

但是vue3不必担心此问题:已解决