前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >vue2笔记1基本用法整理

vue2笔记1基本用法整理

作者头像
路过君
发布2022-04-13 13:35:51
1.1K0
发布2022-04-13 13:35:51
举报
文章被收录于专栏:路过君BLOG from CSDN

准备开发环境

下载vue开发版本 引入

代码语言:javascript
复制
<script src="/js/vue.js"></script>

F12可见提示,引入成功

关闭开发模式提示

代码语言:javascript
复制
Vue.config.productionTip = false;

创建容器和Vue实例

代码语言:javascript
复制
<div id="root"></div>
<script>
	new Vue({
        el: '#root'
    });
</script>

代码语言:javascript
复制
<div id="root"></div>
<script>
	new Vue({}).$mount('#root');
</script>

插值语法

用于解析标签体内容

{{JS表达式}}

代码语言:javascript
复制
<div id="root">
	<h1>{{message}}</h1>
</div>
<script>
	new Vue({
        el: '#root',
        data() {
	        return {
        		message: 'Hello world'
        	}
        }
    });
</script>

指令语法

用于解析标签(属性,标签体内容,绑定事件…)

v-bind:attribute=“JS表达式”

代码语言:javascript
复制
<div id="root">
    <a v-bind:href="url">baidu</a>
</div>
<script type="text/javascript">
    Vue.config.productionTip = false;
    new Vue({
        el: '#root',
        data() {
        	return {
            	url: 'https://www.baidu.com'
            }
        }
    });
</script>

MVVM

  1. M model data数据
  2. V view 模板
  3. VM viewModel Vue实例对象(m中的属性会在vm中代理,v可以使用vm中的所有属性,通过Object.defineProperty实现数据代理)

数据绑定

双向绑定v-model只能用于表单类元素(有value属性的元素)上

代码语言:javascript
复制
单向:<input type="text" v-bind:value="message" />
双向:<input type="text" v-model:value="message" />

简写

代码语言:javascript
复制
单向:<input type="text" :value="message" />
双向:<input type="text" v-model="message" />

事件处理

代码语言:javascript
复制
<button v-on:click="onBtnClick($event,message)">click</button>

简写

代码语言:javascript
复制
<button @click="onBtnClick($event,message)">click</button>
代码语言:javascript
复制
new Vue({
	data() {
		message: 'hello world'
	},
    methods: {
         onBtnClick(event, message) {
		 	alert(message + ' clicked');
         }
     }
})

事件修饰符

代码语言:javascript
复制
<a @click.prevent.stop="onClick">click</a>
  1. prevent 阻止默认事件默认行为(例如标签阻止跳转)
  2. stop 阻止事件冒泡
  3. once 事件只触发一次
  4. capture 使用捕获模式(默认在冒泡阶段执行回调(由内向外),此修饰符可在捕获阶段执行回调(由外向内))
  5. self 只有event.target是当前元素才触发
  6. passive 立即执行事件默认行为,无需等待事件回调结束(例如滚动条滚动事件,防止因回调导致滚动条卡顿)
  7. 键盘事件按键绑定
代码语言:javascript
复制
<input @keydown.Enter="onKey"></input>
<input @keydown.caps-lock="onKey"></input>
<input @keydown.tab="onKey"></input>
<input @keydown.ctrl.x="onKey"></input>
  • tab必须配合keydown,否则焦点离开无法触发
  • 系统修饰键 ctrl,alt,shift,meta(win键) 配合keyup时,按下修时间同时,再按下其他键,随后释放其他键触发 配合keydown时,正常触发

计算属性

代码语言:javascript
复制
<input v-model:value="fn"/>
<input v-model:value="ln"/>
<input v-model:value="fullname"/>
代码语言:javascript
复制
new Vue({
	data() {
		firstname: 'san',
		lastname: 'zhang'
	},
    computed: {
         fullname: {
         	// 1. 初次读取时调用,模板中多次使用,只调用一次(如果使用method定义计算,则会多次调用)
            // 2. 所依赖的数据发生变化时调用
         	get(){
         		return this.firstname + '-' +this.lastname
         	},
         	// 可选,fullname变化时调用
         	set(value){
         		const arr = value.split('-');
         		this.firstname=arr[0];
         		this.lastname=arr[1];
         	}
         }
     }
})
  • 简写 只可读取不可修改 使用计算属性时用fullname而不是fullname()
代码语言:javascript
复制
computed:{
	fullname: function{
		return this.firstname + '-' +this.lastname
	}
}

侦听属性

通过配置

代码语言:javascript
复制
watch: {
    fullname: {
    	immediate: true, // 初始化时调用handler
        handler(newv, oldv) {
            console.log('change', newv, oldv);
        }
    }
}

通过api

代码语言:javascript
复制
let vm = new Vue({...});
vm.$watch('fullname',{
    immediate: true,
    handler(newv, oldv) {
        console.log('change', newv, oldv);
    }
});

简写 不需要其他配置时(immediate,deep)可使用简写

代码语言:javascript
复制
watch:{
	fullname(newValue,oldValue){}
}

深度侦听

代码语言:javascript
复制
data() {
    return {
        name:{
            fn: 'fn',
            ln: 'ln'
        }
    }
},
watch: {
	// 监视结构中属性
	'name.fn':{},
	// 监视结构中所有属性变化
	name:{
		deep:true,
		handler(){};
	}
}

watch vs computed

当需要异步处理计算逻辑时得使用watch

代码语言:javascript
复制
watch:{
	name:{
		deep:true,
		handler(){
			setTimeout(()=>{
				// 注意此处使用箭头函数,this=vue实例
				// 如果使用function ,this=window
				this.fullname = name.fn + name.ln;
			},1000)
		}
	}
}

绑定样式

绑定字符串:名字不确定 绑定数组:样式个数和名字都不确定 绑定对象:个数和名字确定,但不确定用不用

代码语言:javascript
复制
<div class='basic' :class='vClass'></div>
<div class='basic' :class='vClasses'></div>
<div class='basic' :class='vClassObj'></div>
代码语言:javascript
复制
data:{
	vClass: 'class1',
	vClasses:['class1','class2','class3'],
	vClassObj:{
		class1: true,
		class2: false
	}
}

style

表达式绑定值 绑定对象 绑定数组

代码语言:javascript
复制
<div :style="{fontSize: styleObj.fontSize}">123</div>
<div :style="styleObj">123</div>
<div :style="styleObjs">123</div>
代码语言:javascript
复制
data() {
    return {
        styleObj: {
            fontSize: '40px'
        },
        styleObjs:[{},{}]
    }
}

条件渲染

v-show dom结构在,样式为不显示 v-if dom结构不创建,使用if,else指令的元素必须相邻 v-if可以配合template使用,包裹同时控制多个结构

代码语言:javascript
复制
<div v-show="!hidden"></div>
<div v-if="n==1"></div>
<div v-else-if="n==2"></div>
<div v-else></div>

列表渲染

可遍历:数组,对象属性,字符串,指定次数 注:尽量使用key,可以提高性能(更新根据KEY复用/替换已经创建的dom,否则将自动根据index作为Key)

代码语言:javascript
复制
<ul>
    <li v-for="person in psersons" :key="id">{{person.name}}</li>
</ul>
<ul>
    <li v-for="(person,index) in psersons" :key="id">{{index}}-{{person.name}}</li>
</ul>
<ul>
    <li v-for="(attr,key) of car" :key="key">{{key}}:{{attr}}</li>
</ul>
<ul>
	<li v-for=(number,index) of 5></li>
</ul>
代码语言:javascript
复制
data(){
	persons:[{id:1,name:'a'},{id:2,name:'b'}],
	car:{
		name: 'name',
		prices: 100,
		model: 'model'
	}
}

过滤排序

代码语言:javascript
复制
data(){
	minAge: 10,
	sort:0,
	persons:[{id:1,name:'a',age:10},{id:2,name:'b',age:22}]
},
computed:{
	filteredPersons(){
		let arr = this.person.filter((p)=>{return p.age>this.minAge})
		if(this.sort){
			arr.sort((p1,p2)=>{return this.sort === 1 ? p1.age-p2.age : p2.age-p1.age})
		}
	}
},
watch:{
	minAge:{
		immediate: true, // 注意不写此配置,初始渲染会有问题
		handler:function(value){
			this.filteredPersons2 = this.person.filter((p)=>{return p.age>this.minAge});
		}
	}
}

数据更新的问题

  1. 直接在对象中增加属性,没有响应式特性,需使用以下API(不能直接给data添加属性)
代码语言:javascript
复制
let vm = new Vue({
	data() {
		myObj:{}
	}
});
Vue.set(vm._data.myObj,'newProp1','value')
// 或
vm.$set(vm.myObj,'newProp2','value')
  1. 直接替换数组中某个元素(根据索引值修改),会导致列表无法更新,需使用已下数组方法

push() pop() shift() unshift() splice() sort() reverse()

替换数组元素

代码语言:javascript
复制
vm.$set(vm.myArr,index,'value')
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/01/21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备开发环境
  • 创建容器和Vue实例
  • 插值语法
  • 指令语法
  • MVVM
  • 数据绑定
  • 事件处理
    • 事件修饰符
    • 计算属性
    • 侦听属性
      • 深度侦听
      • watch vs computed
      • 绑定样式
        • style
        • 条件渲染
        • 列表渲染
          • 过滤排序
            • 数据更新的问题
            相关产品与服务
            容器服务
            腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档