VUE基础实用技巧
vue以前听说过,有了解过一点。当时还在热衷于原生javascript去写一些方法的封装,不是为啥,就感觉这样很帅,后面多多少少接触了一些jquery的用法,到现在为止,javascript原生封装的一些方法,该忘的都忘了。上一家公司需要用到vue,所以就利用下班的时候学习vue。有次公司部门的培训,一位大佬总结的实用技巧,感觉不错,在这里记录下来,方便以后查询,也与大家分享。
阮一峰老师写的:
1、es6新特性概览
2、vue基础知识
3、vue组件开发
4、vue实用技巧
es6新特性概览
1、箭头函数
var array = [1, 2, 3]; // 传统写法 array.foreach(function(v, i, a){ console.log(v); }); // es6 array.foreach(v = > console.log(v));
2、类的支持
class animal { constructor(name) { this.name = name; } sayname() { console.log('my name is ' + this.name); } } class programmer extends animal { constructor(name) { super(name); // 直接调用父类构造器进行初始化 } program() { console.log("i'm coding..."); } } var animal = new animal('dummy'), wayou = new programmer('wayou'); animal.sayname(); // 输出 'my name is dummy' wayou.sayname(); // 输出 'my name is wayou' wayou.program(); // 输出 'i'm coding...'
3、字符串模板
// 产生一个随机数 var num = math.random(); // 输出数字 console.log(`your num is ${num}`);
4、解构
var [x,y] = getval(), // 函数返回值的解构 [name,,age] = ['wayou','male','secrect']; // 数组解构 function getval() { return [ 1, 2 ]; } console.log(`x:${x},y:${y}`); console.log(`name:${name},age:${age}`);
5、默认参数值
// 传统的指定默认参数的方式 function sayhello(name){ var name = name || 'dude'; console.log('hello ' + name); } // 运用es6的默认参数 function sayhello2(name = 'dude'){ console.log(`hello ${name}`); }
6、不定参数
// 将所有参数相加的函数 function add(...x){ return x.reduce((m,n) => m + n); } // 传递任意个数的参数 console.log(add(1,2,3)); // 输出:6 console.log(add(1,2,3,4,5)); // 输出:15
7、扩展参数
var peoples = ['wayou','john','sherlock']; function sayhello(peo1,peo2,peo3){ console.log(`hello ${peo1},${peo2},${peo3}`); } sayhello(...peoples); // 输出:hello wayou,john,sherlock
8、let与const关键字
for(let i = 0; i < 2 ; i++){ console.log(i); } console.log(i);
9、for of值遍历
var somearray = [ "a", "b", "c" ]; for (v of somearray) { console.log(v); // 输出:a,b,c }
10、set与map集合
var s = new set(); s.add("hello").add("goodbye").add("hello"); console.log(s.size); console.log(s.has("hello")); var m = new map(); m.set("hello", 42); m.set(s, 34); console.log(m.get(s)); 数组去重:[…new set([1,2,3,3])]//如果数组里面的值是对象的话,就不可以了。
11、proxy,proxy可以监听对象身上发生了什么事情,并在这些事情发生后执行一些相应的操作
// 定义被侦听的目标对象 var engineer = { name: 'joe sixpack', salary: 50 }; // 定义处理程序 var interceptor = { set: function (receiver, property, value) { console.log(property, 'is changed to', value); receiver[property] = value; } }; engineer = proxy(engineer, interceptor); // 创建代理以进行侦听 engineer.salary = 60; // 控制台输出:salary is changed to 60
vue基础知识
模板语法:
1、文本
<span>message: {{ msg }}</span> <span v-once>这个将不会改变: {{ msg }}</span>
2、特性
<div v-bind:id="dynamicid"></div>
3、修饰符,事件修饰符、按键修饰符、系统修饰符
4、html
<span v-html="rawhtml"></span>
5、表达式
{{ number + 1 }} {{ ok ? 'yes' : 'no' }} {{ message.split('').reverse().join('') }}
6、缩写
<a :href="url">...</a> <a @click="dosomething">...</a>
7计算属性和侦听器
computed: { reversedmessage: function () {} } watch: { question: function (newval, oldval) {} }
8、条件渲染
<h1 v-if="type === 1">a</h1> <h1 v-else-if="type === 2">b</h1> <h1 v-else>c</h1> // v-show 只是简单地切换元素的 css 属性 display <h1 v-show="ok">hello!</h1>
9、class与style绑定
<div :class="{ active: isactive, 'danger': haserr }"></div> <div :class="[activeclass, errclass]"></div> <div :class="[{ active: isactive }, errclass]"></div> <div :style="{ color: actcol, fontsize: fs + 'px' }"></div> <div :style="styleobject"></div>
10、列表渲染
<ul id="example-2"> <li v-for="(item, index) in items" :key="index"> </li> </ul> <span v-for="n in 10">{{ n }} </span> 数组更新检测:push/pop/shift/unshift/splice等
vue组件开发
1、javascript文件编写组件
vue.component("trip-nav", { template: `<div class='step-tag'></div>`, props: ['trip'], data: function () { return { activeno:1 } }, computed: { }, mounted() { }, methods: { } }); html:<trip-nav :trip=‘tripinfo’></trip-nav>
2、vue文件编写组件
<template> <div class='step-tag'></div> </template> <script lang="ts"> import {component,vue,prop} from "vue-property-decorator"; @component export default class tripnav extends vue { activeno = 1; @prop() trip; get triplist() { return []; } mounted() { } activetrip() { } } </script> import tripnav from "./components/tripnav.vue"; components: {tripnav}
vue实用技巧
1、vue实例会代理实例内data对象内所有属性
var data = { a: 1 } var vm = new vue({ data: data }) vm.a === data.a // -> true
2、camelcase和kebab-case的转换
vue.component('child', { props: ['mymessage'], template: '<span>{{ mymessage }}</span>' }) // 由于html属性是不区分大小写的,需要转为短横线隔开 <child my-message="hello!"></child>
3、组件component实例作用域
vue.component('child', { props: ['msg'], template: '<span>{{ msg }}</span>' }) <child msg="hello!"></child>
4、prop从父组件到子组件双向绑定
<!-- 默认为单向绑定 --> <child :msg="parentmsg"></child> <!-- 双向绑定 --> <child :msg.sync="parentmsg"></child> <!-- 单次绑定:注意单次绑定在数据传入后就不会同步后面的任何变化了,适合传入初始化数据的场景 --> <child :msg.once="parentmsg"></child>
5、事件绑定
使用 $on(eventname) 监听事件 使用 $emit(eventname) 触发事件 父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件
6、命名约定
<!-- 自定义事件也是属于html的属性,所以最好使用中划线形式 --> <child @pass-data="getdata"></child>
7、数据传递
<!-- 子组件通过$emit触发事件,触发的事件+传递的数据 --> this.$emit('pass-data',this.childmsg)
8、sync修饰符
<comp :foo.sync="bar"></comp> this.$emit('update:foo', newvalue)
9、
$parent $parent表示父组件的实例,该属性只读 this.$parent.parentmsg $root $root表示当前组件树的根vue实例 如果当前实例没有父实例,此实例是其自己,该属性只读 this.$root.rootmsg $children $children表示当前实例的直接子组 this.$children 是一个数组 $refs 组件个数较多时,通过在子组件上使用ref属性,给子组件指定一个索引id <child1 ref="c1"></child1> <child2 ref="c2"></child2> this.$refs.c1 this.$refs.c2
官网上一个,页面生命周期图
下面对这些页面生命周期中的部分事件简单介绍下
1、beforecreate
创建前状态:在实例初始化之后,数据观测(data observer) 和 event/watcher 事件配置之前被调用
2、beforemount
挂载前状态:在挂载开始之前被调用,相关的 render 函数首次被调用
3、beforeupdate
更新前状态:数据更新时调用,发生在虚拟 dom 重新渲染和打补丁之前。你可以在这个钩子中进一步地更改状态,这不会触发附加的重渲染过程
4、beforedestroy
销毁前状态:实例销毁之前调用,此时实例仍然完全可用
5、created
创建完毕状态:实例已经创建完成之后被调用,实例已完成数据观测,属性和方法的运算, watch/event 事件回调。此时挂载阶段还没开始,$el 属性目前不可见
6、mounted
挂载结束状态:el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子
7、updated
更新完成状态 :组件 dom 已经更新,所以你现在可以执行依赖于 dom 的操作
8、destroyed
销毁完成状态:vue实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁
这个页面生命周期,我就只能记得住常用的那三四个吧。这个生命周期,每次用到的时候,我都会去官网上面看。很是惭愧。。。
上一篇: 第十六章、浅识数据库
下一篇: 理解迭代器和可迭代对象