Vue是一个MVVM框架,数据双向绑定。
Vue.js与页面交互,通过指令完成
对某一个功能进行封装,可重复用的代码
vue-router—>官方插件,进行页面跳转
vuex进行存储
插值表达式:{{message}}
v-bind:title = “message” / :title = "message"
v-if=“seen”
v-for =“item in muster” {{item}}
v-on:click="click" / @click="click"
v-model='message' ==>双向绑定
添加数据
todos.push() ==> 添加到末尾
删除末尾元素 ==> todos.pop()
todos.unshift() ==> 添加到开头
删除开头元素 ==> todos.shift()
3)数组截取数据
v-for='item in demoArray.slice(0,5)'
数据绑定最常见的方式就是使用‘’Mustache‘’语法(双大括号)的文本插值:
例:
<span>Message: {{ msg }}span>
含义:执行一次性的插值
通过使用v-once指令,你也能执行一次性的插值,当数据改变时,插值处的内容不会更新。但请留心这会影响到该节点上的其他数据绑定:
例:
<span v-once>这个将不会改变:{{ msg }}span>
含义:使style得以表达
例:
含义: v-text结果和插值表达式 是一样的
例:
<div>
number+1运算: {{number + 1}}
div>
<div>
三元运算符:{{ ok ? "yes" : "no" }}
div>
<div>
{{message.split('').reverse().join('')}}
div>
举例:
测试动态参数
不可见的元素包裹
区别:
1. v-show 只是简单的控制元素的 display 属性,而 v-if 才是条件渲染(条件为真,元素将会被渲染,条件为假,元素会被销毁);2. v-show 有更高的初始渲染开销(频繁切换,建议使用 v-show),而 v-if 的首次渲染开销要小的多;3. v-if 有更高的切换开销,v-show 切换开销小;4. v-if 有配套的 v-else-if 和 v-else,而 v-show 没有5. v-if 可以搭配 template 使用,而 v-show 不行6. v-if 是惰性的,出事条件什么都不做,当第一次为真,才开始条件渲染7. v-show 不管出事条件是什么,元素一直被渲染,基于css进行切换,display注意: 不推荐v-if和v-for一起使用(v-for优先级高一点)
const app = new Vue({ el: '#app', data: { message: 'hello' }, methods: { func(message, event) { } }})访问原始dom事件
{{reverse}}computed:{ reverse(){ return this.message。split('').reverse().join('') }}
计算属性是基于他们的响应式依赖进行缓存的,只有相关响应式依赖发生改变时,他们才会重新求值。
方法是多次执行的
//方法methods: { reversedMessage: function () { return this.message.split('').reverse().join('') }}//计算属性computed: { // 计算属性的 getter reversedMessage: function () { // `this` 指向 vm 实例 return this.message.split('').reverse().join('') } }
用来侦听某个属性是不是变化的
const app = new Vue({ el: '#app', data: { message: 'hello' },methods: { reversedMessage: function () { return this.message.split('').reverse().join('') }}//计算属性computed: { // 计算属性的 getter reversedMessage: function () { // `this` 指向 vm 实例 return this.message.split('').reverse().join('') } } //侦听属性 watch: { message(val,oldval){ } list{ Handle(val,oldval){ }, deep:true } }})
v-bind:class=‘red’
:class = “{key:value}”
:class=’[key,value]’
:class=’[‘isRed’?red : green]’
hello world
color是data中的数据
data() { return { color: {color:red}, font: {fontSize:28px} }}
data: { array:[ {text:'aaaaa'}, {text:'bbbbb'}, ]}//顺序是固定的,名字可变this.array.foreach((item, index, data) ==> {})
v-for:数组、对象、数字
data:{ object: { title:'标题', author:'作者' }}//注意不能保证拿到的值和数据源的顺序是一致的//value
当数据循序改变时,只是元素显示的索引正确,但并没有真正的更新到DOM中。
v-for优先级高于v-if
先处理数据再v-for
computed:{}
data: { message: ''}相当于两个指令的集合1. :value='message'2. @input='message=$event.target.value'
data: { checked: false}
//for规定label与哪个表单元素进行绑定data: { checked: []}
beforCreate() {}
created(){}
beforMount(){}
mounted(){}
beforupdate(){}
update(){}
beforDestory(){}
Destory(){}
// 第一个声明周期的钩子函数 beforeCreate() { console.log(this.show); this.show() }, created() { console.log(this.show); this.show() }, //第三个生命周期,模板已经渲染,但还没有挂载到页面上 beforeMount() { console.log(document.getElementById('hh').innerText); }, //内存中模板替换到页面中 mounted() { console.log(document.getElementById('hh').innerText); }, //mounted执行完毕之后,vue实例已经创建完成。 //beforupdate,页面没有更新,但是数据更新了 beforUpdate() { console.log(document.getElementById('hh').innerText); console.log(this.message); }, //页面和数据都已经更新了 update() { console.log(document.getElementById('hh').innerText); console.log( 'message' ,this.message); }, //销毁阶段 //第七个生命周期函数,所有的data和methods,指令、、、都处于可用,尚未销毁 beforeDestroy() { }, //一切都没了 Destroy() {}
父子组件传值
父组件向子组件传值:props:{ ‘ list’ : Array}
子组件向父组件传值:
//不带参数
this.$emit(‘delete’)
this.$emit(‘delete’, index)
.lazy 懒加载
.number 数字
. stop:阻止冒泡(通俗讲就是阻止事件向上级DOM元素传递)
. prevent:阻止默认事件的发生
. capture:捕获冒泡,即有冒泡发生时,有该修饰符的dom元素会先执行,如果有多个,从外到内依次执行,然后再按自 然顺序执行触发的事件。
. self:将事件绑定到自身,只有自身才能触发,通常用于避免冒泡事件的影响
. once:设置事件只能触发一次,比如按钮的点击等。
. passive:该修饰符大概意思用于对DOM的默认事件进行性能优化,根据官网的例子比如超出最大范围的滚动条滚动的 方法,可以使用该修饰符进行加强,但是效果并没有感觉到。
com3子组件
比promise更好的解决了回调地狱。
async function() { awiat fn()}
新的基本类型
存储任何类型的唯一值,即集合中所保存的元素是不重复的。类数组结构。
arr = [1,2,3,1]let arrNew = new Set(arr)arrNew = [1,2,3]
类数组不是数组,要转化为数组Array.form(arrNew)
这样arrNew才是数组了
(macro)task,可以理解是每次执行栈执行的代码就是一个宏任务(包括每次从事件队列中获取一个事件回调并放到执行栈中执行)。
浏览器为了能够使得JS内部(macro)task与DOM任务能够有序的执行,会在一个(macro)task执行结束后,在下一个(macro)task 执行开始前,对页面进行重新渲染,流程如下:
(macro)task->渲染->(macro)task->...
script(整体代码)setTimeoutsetIntervalI/OUI交互事件postMessageMessageChannelsetImmediate(Node.js 环境)
microtask,可以理解是在当前 task 执行结束后立即执行的任务。也就是说,在当前task任务后,下一个task之前,在渲染之前。
所以它的响应速度相比setTimeout(setTimeout是task)会更快,因为无需等渲染。也就是说,在某一个macrotask执行完后,就会将在它执行期间产生的所有microtask都执行完毕(在渲染前)。
Promise.thenObject.observeMutationObserverprocess.nextTick(Node.js 环境)
在事件循环中,每进行一次循环操作称为 tick,每一次 tick 的任务处理模型是比较复杂的,但关键步骤如下:
执行一个宏任务(栈中没有就从事件队列中获取)执行过程中如果遇到微任务,就将它添加到微任务的任务队列中宏任务执行完毕后,立即执行当前微任务队列中的所有微任务(依次执行)当前宏任务执行完毕,开始检查渲染,然后GUI线程接管渲染渲染完毕后,JS线程继续接管,开始下一个宏任务(从事件队列中获取)
同步与异步、宏任务和微任务分别是函数两个不同维度的描述。
异步任务:setTimeout和setInterval、ajax、事件绑定等
同步任务:除了异步任务外的所有任务
微任务:process.nextTick和 Promise后的theny语句和catch语句等
宏任务:除了微任务以外的所有任务
执行顺序判断方法
先同步再异步,在此基础上先宏任务再微任务