# vue基础
# 使用jquery和vue框架的区别
- 数据和视图的分离,解藕(开放封闭原则)
- 以数据驱动视图,只关心数据变化, DOM操作被封装
# 说一下对MVVM的理解
- mvc基本介绍
- view: view视图 界面
- model:数据模型
- control:控制器(逻辑处理)
- mvvm基本介绍
- View:视图 模版(视图和模型是分离的)
- 通过事件绑定影响model
- Model:模型,数据
- 通过事件绑定影响model
- ViewModel:连接Model和View(连接器)
- 所谓双向数据绑定,即数据变化更新视图,视图变化更新数据
- View:视图 模版(视图和模型是分离的)
# vue的三要素
- 响应式: vue如何监听到data的每个属性变化
- 模版引擎: vue的模版如何被解析,指令如何处理
- 渲染:vue的模版如何被渲染成html,以及渲染过程
# 什么是响应式
- 修改data属性之后,vue立刻监听到
- data属性被代理到vm上
- object.defineProperty模拟实现(响应式模拟)
var vm= {}
var data = {
name: 'zhangsan',
age: 'lisi'
}
var key, value
for(key in value){
function(key){
Object.defineProperty(vm, key, {
get: function(){
console.log('get', data[key]) //监听
return data[key]
}
set: function(newVal){
console.log('set', newVal) //监听
data[key] = newVal
}
}){
}
}(key)
}
# vue中如何解析模版
模版是什么
- 本质是字符串
- 有逻辑,v-if v-for等
- 与html格式很像,但有很大区别,html是静态的,vue是动态的
- 最终还是要转化为html来展示
- 模版最终要转换为js代码原因:
- 有逻辑 v-if,v-for,必须用js才能实现(图灵完备)
- 转换为html渲染页面,必须由js实现
- 因此模版最终要转换为一个js函数(render函数)
render函数
vdom
# vue的整个实现流程
- 解析模版成render函数
- width的用法
- 模版中的所有信息都被render函数包含
- 模版中用到的data的属性,全都变成js变量
- 模版中的v-if v-for v-on,全部都变成了js逻辑
- render函数返回vnode
- 响应式开始监听
- object.defineProperty
- 将data的属性代理到vm上
- 首次渲染,显示页面,且绑定依赖
- data属性变化,触发rerender
# vue双向数据绑定原理
- vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。
# vue组件间的参数传递
# vue的路由实现
hash ——即地址栏URL中的#符号。比如这个URL:http://www.abc.com/#/hello, hash 的值为#/hello。它的特点在于:hash 虽然出现URL中,但不会被包含在HTTP请求中,对后端完全没有影响,因此改变hash不会重新加载页面。
history ——利用了HTML5 History Interface 中新增的pushState() 和replaceState() 方法。(需要特定浏览器支持) 这两个方法应用于浏览器的历史记录站,在当前已有的back、forward、go 的基础之上,它们提供了对历史记录进行修改的功能。只是当它们执行修改是,虽然改变了当前的URL,但你浏览器不会立即向后端发送请求。 history模式,会出现404 的情况,需要后台配置。
404 错误
hash模式下,仅hash符号之前的内容会被包含在请求中,如 http://www.abc.com, 因此对于后端来说,即使没有做到对路由的全覆盖,也不会返回404错误;
history模式下,前端的url必须和实际向后端发起请求的url 一致,如http://www.abc.com/book/id 。如果后端缺少对/book/id 的路由处理,将返回404错误。
# vue路由传参的三种方法
- 直接在路由中写参数
<li v-for="article in articles" @click="getDescribe(article.id)">
getDescribe(id) {
// 直接调用$router.push 实现携带参数的跳转
this.$router.push({
path: `/describe/${id}`,
})
//在router--->index.js进行配置
{
path: '/describe/:id',
name: 'Describe',
component: Describe
}
//通过this.$route.prams.id取值
- 通过prams传参
this.$router.push({
name: 'Describe',
params: {
id: id
}
})
//在router--->index.js进行配置
{
path: '/describe',
name: 'Describe',
component: Describe
}
//通过this.$route.prams.id取值
- 通过query传参
this.$router.push({
path: '/describe',
query: {
id: id
}
//在router--->index.js进行配置
{
path: '/describe',
name: 'Describe',
component: Describe
}
//通过this.$route.query.id取值
# vue的路由钩子函数
# vuex面试相关
- (1)vuex是什么?怎么使用?哪种功能场景使用它?
vue框架中状态管理。在main.js引入store,注入。新建一个目录store,….. export 。场景有:单页应用中,组件之间的状态。音乐播放、登录状态、加入购物车
- (2)vuex有哪几种属性?
有五种,分别是 State、 Getter、Mutation 、Action、 Module
vuex的State特性
A、Vuex就是一个仓库,仓库里面放了很多对象。其中state就是数据源存放地,对应于一般Vue对象里面的data
B、state里面存放的数据是响应式的,Vue组件从store中读取数据,若是store中的数据发生改变,依赖这个数据的组件也会发生更新
C、它通过mapState把全局的 state 和 getters 映射到当前组件的 computed 计算属性中
vuex的Getter特性
A、getters可以对State进行计算操作,它就是Store的计算属性
B、 虽然在组件内也可以做计算属性,但是getters 可以在多组件之间复用
C、 如果一个状态只在一个组件内使用,是可以不用getters
vuex的Mutation特性
- Action 类似于 mutation,不同在于:Action 提交的是 mutation,而不是直接变更状态;Action 可以包含任意异步操作。
(3)不用Vuex会带来什么问题?
可维护性会下降,想修改数据要维护三个地方;
可读性会下降,因为一个组件里的数据,根本就看不出来是从哪来的;
增加耦合,大量的上传派发,会让耦合性大大增加,本来Vue用Component就是为了减少耦合,现在这么用,和组件化的初衷相背。
# css只在当前组件起作用?
当前组件<style>写成<style scoped>
# v-if和v-show的区别?
- v-if的显示和隐藏是在dom里创建和消除dom节点
- v-show是用css样式的display来控制dom节点的显示和隐藏
# $route和$router的区别
- 在任何组件内通过 this.$router访问路由器,也可以通过 this.$route 访问当前路由
# vue.js的两个核心是什么
- 数据驱动
- 组件系统
# vue几种常用的指令
- v-text v-html v-bind v-on v-model v-for
# vue常用的修饰符
# v-on可以绑定多个方法吗
- 可以
# vue中key值的作用!!!
- 需要提供一个唯一的key值(常用ID),以便它能跟踪每个节点的身份,从而重用和重新排序现有元素
# 什么是vue的计算属性
# vue等单页面应用及其优缺点
- 优点:
Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件,核心是一个响应的数据绑定系统。MVVM、数据驱动、组件化、轻量、简洁、高效、快速、模块友好。
- 缺点:
不支持低版本的浏览器,最低只支持到IE9;不利于SEO的优化(如果要支持SEO,建议通过服务端来进行渲染组件);第一次加载首页耗时相对长一些;不可以使用浏览器的导航按钮需要自行实现前进、后退。
# 浏览器输入url到页面展示发生了些什么
# 性能优化
← Introduction vue组件通信 →