生命周期
// 创建之前,在beforeCreate生命周期执行的时候,data和methods中的数据都还没有初始化,不能访问data数据
1. beforeCreate(){
console.log('beforeCreate',this.msg);
},
//创建之后,data和methods中的数据已经初始化,此时可以访问data数据
// 一般在这个函数中发起ajax请求
2. created(){
console.log('created',this.msg);
},
// 挂载之前,表示模板已经在内存中编译完成,但尚未把模板渲染到页面中。
// 此时还没有渲染用数据生成的新dom
3. beforeMount(){
console.log('beforeMount',this.el);
},
// 更新之前,当且仅当data被修改时才触发这个生命周期函数,但此时仅仅是数据被修改,页面还未更新。
5. beforeUpdate(){
console.log('beforeUpdate',this.msg);
console.log('beforeUpdate',this.el.innerHTML);
},
// 销毁之前,当执行beforeDestory钩子函数的时候,Vue实例就已经从运行阶段,进入到了销毁阶段。
// 当执行beforeDestory的时候,实例身上所有的data和所有的methods,以及过滤器、指令...都处于可用状态,此时还没有真正执行销毁过程。
7. beforeDestroy(){
console.log('beforeDestroy');
},
// 销毁之后,当执行到destoryed函数的时候,组件已经被全部销毁了,data与methods均不可用。
// 更改data数据,页面不会更新
//应用: 清除定时器
8. destroyed(){
console.log('destroyed');
}
当使用了缓存组件时,会增加两个生命周期钩子
Vue全家桶
vue的全家桶:
vue.js
vue-router.js
vue-cli (脚手架,快速搭建vue项目)
axios
vuex.js
v-if与v-show的区别
v-if的显示和隐藏 是dom的创建与销毁
v-show的显示和隐藏是 基于display-none 和 display-block 无论是显示或是隐藏都会生成dom
vue指令
v-html 元素的innerHTML
v-text 元素的InnerText 只能用在双标签中
v-model 双向数据流绑定 主要作用于表单的 value 属性
v-bind 给元素绑定动态属性
v-on 处理自定义原生事件
v-if
v-else
v-else-if
v-show
v-once 只渲染一次 ,数据改变,视图更新,但v-once对应的元素不会再更新
v-slot 插槽
vue 脚手架中的data为什么必须是个函数
避免组件中的数据互相影响
组件中的data写成一个函数,数据以函数返回值形式定义,这样每复用一次组件,就会返回一份新的data,类似于给每个组件实例创建一个私有的数据空间,让各个组件实例维护各自的数据。而单纯的写成对象形式,就使得所有组件实例共用了一份data,就会造成一个变了全都会变的结果。
vue中计算属性computed和方法methods和侦听器watch的区别
-
计算属性和方法都是函数,计算属性一定有返回值,它通过对数据进行处理,返回一个结果
2. 在模板中调用时,计算属性不加(),而methods必须需要加() 3. 计算属性和方法最主要的区别是计算属性有缓存功能。 方法被调用时每次都要重复执行函数 计算属性初次调用时执行函数,然后会缓存结果。当再次被调用时,如果依赖的响应式数据没有发生改变,则直接返回之前缓存的结果 。 如果依赖发生了改变,则会再次执行函数并缓存结果 4. 不支持异步,当computed内有异步操作时无效,无法监听数据的变化
watch:
1. 侦听响应式数据的变化,数据变化时,执行相应的业务逻辑,可以有返回值,也可以没有
2. 侦听器默认在页面初始化时不执行,只有侦听数据发生变化才会执行。添加上immediate可初始化时就执行
3. 添加上immediate可初始化时就执行
Vue中如何获取原生dom
- 在元素标签上添加ref属性
- 通过this.$refs.属性名来获取dom
- 应用场景: 楼层导航中,要获取每个楼层距离页面顶端的偏移值
注意:如果是异步请求的数据渲染的dom 需要使用 this.$nextTick()回调来获取更新后的dom
- {{item}}
这是一个段落
Vue中的 this.$nextTick()
一般在请求数据后,需要获取dom的时候使用。
在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。
Vue中 this.$router 与this.$route的区别
在一个vue组件中,都可以访问到这两个对象,它俩的区别
this.$route是路由记录对象,只读,存储了与路由相关的信息
this.$router是路由对象,用来进行路由跳转
什么是SPA 单页面应用
单页Web应用(single page web application,SPA): SPA 是一种特殊的 Web 应用,是加载单个 HTML 页面并在用户与应用程序交互时动态更新该页面的。它将所有的活动局限于一个 Web 页面中,仅在该 Web 页面初始化时加载相应的 HTML 、 JavaScript 、 CSS 。一旦页面加载完成, SPA 不会因为用户的操作而进行页面的重新加载或跳转,而是利用 JavaScript 动态的变换 HTML(采用的是 div 切换显示和隐藏),从而实现UI与用户的交互。在 SPA 应用中,应用加载之后就不会再有整页刷新。相反,展示逻辑预先加载,并有赖于内容Region(区域)中的视图切换来展示内容。
实现数组,对象更新检测的方法
push()
pop()
shift()
unshift()
splice()
sort()
reverse()
// ====================================数组更新检测
// 三个参数: 数组,索引,新值
Vue.set(this.list,3,5) //可以触发视图更新
this.$set(this.list,3,5) //可以触发视图更新
// =====================================对象的更新检测
// 三个参数:对象,属性,新值
Vue.set(this.person,"sex","男") //可以触发视图更新
this.$set(this.list,3,5) //可以触发视图更新
for循环中的key值的作用
需要使用key来给每个节点做一个唯一标识,Diff算法就可以正确的识别此节点,找到正确的位置区插入新的节点。
所以一句话,**key的作用主要是为了高效的更新虚拟DOM**。
另外vue中在使用相同标签名元素的过渡切换时,也会使用到key属性,其目的也是为了让vue可以区分它们,否则vue只会替换其内部属性而不会触发过渡效果。
为什么v-for和v-if不能在同一标签(元素)上
v-for比v-if优先,即每一次都需要遍历整个数组,影响速度。
以上代码,如果有100条数据,虽然显示两条,但需要遍历100次,因为v-for优先
更好的解决方案: 是用computed先获取符合条件的数据,再进行遍历
事件修饰符
事件修饰符: @click.修饰符
1. @click.stop 阻止冒泡
2. @click.prevent 阻止浏览器默认行为
3. @click.once 只执行一次
4. @keyup.键名 (13,enter都是指回车键, 38: 上箭头)
5. @click.self 当事件发生在该元素本身而不是子元素的时候会触发;
6. @click.capture 在事件捕获阶段触发事件处理程序
[email protected] 使非原生标签也可以绑定事件
token的工作流程
1.用户填写登录信息,发起请求,服务端收到请求,去验证用户名与密码
2.验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
3.客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
4.客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
5.服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
什么是Vuex
如果应用比较简单,就不需要使用Vuex,直接使用父子组件传值及它传值方式即可,使用Vuex就要额外的引入vuex的框架,可能是繁琐冗余的
如果需要构建一个中大型单页应用,就可以使用vuex更好地在组件外部管理状态
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。
它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
Vuex的工作流程
一、在项目创建store文件夹,及index.js
定义相关的vuex的state, getters actions mutations
二、在入口文件main.js中引入store,并在根实例注册
三、在任一组件中,通过this.$store.state就可以访问到共享数据
四、当通过组件要修改store中的数据时,
1. 如果该操作是同步的,可以用this.$store.commit()来触发mutations, 只有mutations才可以直接更改state共享数据
2. mutations中只能有同步操作,不能有异步操作
3. 如果修改数据的操作是异步的,通过this.$store.dispatch()触发actions, actions中可以发起异步请求,获取数据后,再调用 commit触发mutations,通过mutations修改共享数据
Vuex的五个属性
State
储存公共数据
Action
类似于mutation 不同在于
Action 提交的是mutation,而不是直接变更状态,(action不能直接更改state数据)
Action 可以包含任意异步操作
总结一下:
mutation不能有异步操作,而action可以有异步操作
mutation可以直接更改数据,而action只能通过提交mutation,通过mutation的方法来改变数据
实际通过组件改变数据时,如果没有异步操作,可以直接提交(commit)mutation,如果有异步操作,必须派发(dispatch)action,通过action提交(commit)mutation来更改数据
Mustion
更改Vuex中store中的状态唯一的办法是提交mutation
mutation的方法中有两个参数,一个是state,第二个是参数
mutations:{
方法名(state,参数){
state.属性=参数
}
}
在组件中提交mutations的方法:this.$store.commit('方法名',参数)
state中的数据时响应式的,数据改变,相关视图会重新渲染
getters
就像计算属性一样,getter的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算
Modelu 模块
Vuex中的辅助函数
mapState
mapGetters
mapActions
mapMutations
Vue中如何自定义组件
一、普通组件
- 新建一个单个文件组件 *.vue , 内部: