vue 实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫持各个属性的 setter,getter,在数据变动时发布消息给订阅者,触发相应监听回调 单向数据流: 顾名思义,数据流是单向的。数据流动方向可以跟踪,流动单一,追查问题的时候可以更快捷。缺点就是写起来不太方便。要使UI发生变更就必须创建各种 action 来维护对应的 state 双向数据绑定:数据之间是相通的,将数据变更的操作隐藏在框架内部。优点是在表单交互较多的场景下,会简化大量业务无关的代码。缺点就是无法追踪局部状态的变化,增加了出错时 debug 的难度 vue-router 默认使用 hash 模式,所以在路由加载的时候,项目中的 url 会自带 #。如果不想使用 #, 可以使用 vue-router 的另一种模式 history new Router({ View 传送指令到 Controller MVVM特点: 各部分之间的通信,都是双向的 vue实例有一个完整的生命周期,生命周期也就是指一个实例从开始创建到销毁的这个过程 beforeCreate() 在实例创建之间执行,数据未加载状态 父组件向子组件通信 子组件通过 props 属性,绑定父组件数据,实现双方通信 子组件向父组件通信 将父组件的事件在子组件中通过 $emit 触发 非父子组件、兄弟组件之间的数据传递 路由就是用来跟后端服务器进行交互的一种方式,通过不同的路径,来请求不同的资源,请求不同的页面是路由的其中一种功能 参考 这里 使用了 v-if 的时候,如果值为 false ,那么页面将不会有这个 html 标签生成。 v-show 则是不管值为 true 还是 false ,html 元素都会存在,只是 CSS 中的 display 显示或隐藏 $router 为 VueRouter 实例,想要导航到不同 URL,则使用 $router.push 方法 $route 为当前 router 跳转对象里面可以获取 name 、 path 、 query 、 params 等 $nextTick 是在下次 DOM 更新循环结束之后执行延迟回调,在修改数据之后使用 $nextTick,则可以在回调中获取更新后的 DOM 具体可参考官方文档 深入响应式原理 因为js本身的特性带来的,如果 data 是一个对象,那么由于对象本身属于引用类型,当我们修改其中的一个属性时,会影响到所有Vue实例的数据。如果将 data 作为一个函数返回一个对象,那么每一个实例的 data 属性都是独立的,不会相互影响了 我们可以将同一函数定义为一个 method 或者一个计算属性。对于最终的结果,两种方式是相同的 不同点: computed: 计算属性是基于它们的依赖进行缓存的,只有在它的相关依赖发生改变时才会重新求值 对于 method ,只要发生重新渲染,method 调用总会执行该函数 jQuery 专注视图层,通过操作 DOM 去实现页面的一些逻辑渲染; Vue 专注于数据层,通过数据的双向绑定,最终表现在 DOM 层面,减少了 DOM 操作 Vue 使用了组件化思想,使得项目子集职责清晰,提高了开发效率,方便重复利用,便于协同开发 全局注册 局部注册 可以用全局方法 Vue.filter() 注册一个自定义过滤器,它接收两个参数:过滤器 ID 和过滤器函数。过滤器函数以值为参数,返回转换后的值 过滤器也同样接受全局注册和局部注册 keep-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染 可以使用API提供的props,实现组件的动态缓存 key 的特殊属性主要用在 Vue 的虚拟 DOM 算法,在新旧 nodes 对比时辨识 VNodes。如果不使用 key,Vue 会使用一种最大限度减少动态元素并且尽可能的尝试修复/再利用相同类型元素的算法。使用 key,它会基于 key 的变化重新排列元素顺序,并且会移除 key 不存在的元素。 有相同父元素的子元素必须有独特的 key。重复的 key 会造成渲染错误 数据驱动 组件系统 优点: 良好的交互体验 SEO难度较高 vue-router 可以通过 params 与 query 进行传参 // 传递 // 接收 this.$route.query MVVM 是 Model-View-ViewModel 的缩写。mvvm 是一种设计思想。Model 层代表数据模型,也可以在 Model 中定义数据修改和操作的业务逻辑;View 代表 UI 组件,它负责将数据模型转化成 UI 展现出来,ViewModel 是一个同步 View 和 Model 的对象。 在 MVVM 架构下,View 和 Model 之间并没有直接的联系,而是通过 ViewModel 进行交互,Model 和 ViewModel 之间的交互是双向的, 因此 View 数据的变化会同步到 Model 中,而 Model 数据的变化也会立即反应到 View 上。 ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来,而 View 和 Model 之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作 DOM, 不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。 mvc 和 mvvm 其实区别并不大。都是一种设计思想。主要就是 mvc 中 Controller 演变成 mvvm 中的 viewModel。mvvm 主要解决了 mvc 中大量的 DOM 操作使页面渲染性能降低,加载速度变慢,影响用户体验。和当 Model 频繁发生变化,开发者需要主动更新到 View 。 答:总共分为 8 个阶段创建前/后,载入前/后,更新前/后,销毁前/后。 vue-router 模块的 router-link 组件。 在实际项目中我们会碰到多层嵌套的组件组合而成,但是我们如何实现嵌套路由呢?因此我们需要在 VueRouter 的参数中使用 children 配置,这样就可以很好的实现路由嵌套。 main.js,路由的重定向,就会在页面一加载的时候,就会将 home 组件显示出来,因为重定向指向了 home 组件,redirect 的指向与 path 的必须一致。children 里面是子路由,当然子路由里面还可以继续嵌套子路由。 home.vue,点击显示就会将子路由显示在出来,子路由的出口必须在父路由里面,否则子路由无法显示。 webpack 中提供了 require.ensure()来实现按需加载。以前引入路由是通过 import 这样的方式引入,改为 const 定义的方式进行引入。 vue 框架中状态管理。在 main.js 引入 store,注入。新建了一个目录 store,…… export 。场景有:单页应用中,组件之间的状态。音乐播放、登录状态、加入购物车 三种 v-if(判断是否隐藏)、v-for(把数据遍历出来)、v-bind(绑定属性)、v-model(实现双向绑定) vue.js 是采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty()来劫持各个属性的 setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。 具体步骤: 第二步:compile 解析模板指令,将模板中的变量替换成数据,然后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,添加监听数据的订阅者,一旦数据有变动,收到通知,更新视图 第三步:Watcher 订阅者是 Observer 和 Compile 之间通信的桥梁,主要做的事情是: 第四步:MVVM 作为数据绑定的入口,整合 Observer、Compile 和 Watcher 三者,通过 Observer 来监听自己的 model 数据变化,通过 Compile 来解析编译模板指令,最终利用 Watcher 搭起 Observer 和 Compile 之间的通信桥梁,达到数据变化 -> 视图更新;视图交互变化(input) -> 数据 model 变更的双向绑定效果。 有 5 种,分别是 state、getter、mutation、action、module 如果请求来的数据不是要被其他组件公用,仅仅在请求的组件内使用,就不需要放入 vuex 的 state 里 如果被其他地方复用,请将请求放入 action 里,方便复用,并包装成 promise 返回 vuex 仅仅是作为 vue 的一个插件而存在,不像 Redux,MobX 等库可以应用于所有框架,vuex 只能使用在 vue 上,很大的程度是因为其高度依赖于 vue 的 computed 依赖检测系统以及其插件系统, vuex 整体思想诞生于 flux,可其的实现方式完完全全的使用了 vue 自身的响应式设计,依赖监听、依赖收集都属于 vue 对对象 Property set get 方法的代理劫持。最后一句话结束 vuex 工作原理,vuex 中的 store 本质就是没有 template 的隐藏着的 vue 组件; Vue.use(Vuex) 方法执行的是 install 方法,它实现了 Vue 实例对象的 init 方法封装和注入,使传入的 store 对象被设置到 Vue 上下文环境的 在 store 构造方法中有 makeLocalContext 方法,所有 module 都会有一个 local context,根据配置时的 path 进行匹配。所以执行如 dispatch(‘submitOrder’, payload)这类 action 时,默认的拿到都是 module 的 local state,如果要访问最外层或者是其他 module 的 state,只能从 rootState 按照 path 路径逐步进行访问。 store 初始化时,所有配置的 action 和 mutation 以及 getters 均被封装过。在执行如 dispatch(‘submitOrder’, payload)的时候,actions 中 type 为 submitOrder 的所有处理方法都是被封装后的,其第一个参数为当前的 store 对象,所以能够获取到 { dispatch, commit, state, rootState } 等数据。 Vuex 中修改 state 的唯一渠道就是执行 commit(‘xx’, payload) 方法,其底层通过执行 this._withCommit(fn) 设置_committing 标志变量为 true,然后才能修改 state,修改完毕还需要还原_committing 变量。外部修改虽然能够直接修改 state,但是并没有修改_committing 标志位,所以只要 watch 一下 state,state change 时判断是否_committing 值为 true,即可判断修改的合法性。 devtoolPlugin 中提供了此功能。因为 dev 模式下所有的 state change 都会被记录下来,‘时空穿梭’ 功能其实就是将当前的 state 替换为记录中某个时刻的 state 状态,利用 store.replaceState(targetState) 方法将执行 this._vm.state = state 实现。 axios 是请求后台资源的模块。 npm i axios -S 如果发送的是跨域请求,需在配置文件中 config/index.js 进行配置文章目录
说一下Vue的双向绑定数据的原理
解释单向数据流和双向数据绑定
Vue 如何去除url中的
mode: ‘history’,
routes: [ ]
})
需要注意的是,当我们启用 history 模式的时候,由于我们的项目是一个单页面应用,所以在路由跳转的时候,就会出现访问不到静态资源而出现 404 的情况,这时候就需要服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面对 MVC、MVVM的理解
MVC特点:
Controller 完成业务逻辑后,要求 Model 改变状态
Model 将新的数据发送到 View,用户得到反馈
所有通信都是单向的
采用双向绑定:View 的变动,自动反映在 ViewModel,反之亦然
具体请移步 这里介绍虚拟DOM
vue生命周期的理解
created() 在实例创建、数据加载后,能初始化数据,dom渲染之前执行
beforeMount() 虚拟dom已创建完成,在数据渲染前最后一次更改数据
mounted() 页面、数据渲染完成,真实dom挂载完成
beforeUpadate() 重新渲染之前触发
updated() 数据已经更改完成,dom 也重新 render 完成,更改数据会陷入死循环
beforeDestory() 和 destoryed() 前者是销毁前执行(实例仍然完全可用),后者则是销毁后执行组件通信
/*新建一个Vue实例作为中央事件总嫌*/ let event = new Vue(); /*监听事件*/ event.$on('eventName', (val) => { //......do something }); /*触发事件*/ event.$emit('eventName', 'this is a message.') Vuex 数据管理
vue-router 路由实现
v-if 和 v-show 区别
$
route和$
router的区别NextTick 是做什么的
Vue 组件 data 为什么必须是函数
计算属性computed 和事件 methods 有什么区别
对比 jQuery ,Vue 有什么不同
Vue 中怎么自定义指令
// 注册一个全局自定义指令 `v-focus` Vue.directive('focus', { // 当被绑定的元素插入到 DOM 中时…… inserted: function (el) { // 聚焦元素 el.focus() } })
directives: { focus: { // 指令的定义 inserted: function (el) { el.focus() } } }
Vue 中怎么自定义过滤器
Vue.filter('reverse', function (value) { return value.split('').reverse().join('') })
<!-- 'abc' => 'cba' --> <span v-text="message | reverse"></span>
对 keep-alive 的了解
<keep-alive> <component> <!-- 该组件将被缓存! --> </component> </keep-alive>
Vue 中 key 的作用
Vue 的核心是什么
vue 等单页面应用的优缺点
良好的前后端工作分离模式
减轻服务器压力
缺点:
前进、后退管理
初次加载耗时多vue-router 使用params与query传参有什么区别
this.$
router.push({path: ‘./xxx’, params: {xx:xxx}})
this.$
router.push({path: ‘./xxx’, query: {xx:xxx}})
this.$route.params
params 是路由的一部分,必须要有。query 是拼接在 url 后面的参数,没有也没关系
params 不设置的时候,刷新页面或者返回参数会丢,query 则不会有这个问题什么是 mvvm?
mvvm 和 mvc 区别?
vue 的优点是什么?
请详细说下你对 vue 生命周期的理解?
组件之间的传值?
//父组件通过标签上面定义传值 <template> <Main :obj="data"></Main> </template> <script> //引入子组件 import Main form "./main" exprot default{ name:"parent", data(){ return { data:"我要向子组件传递数据" } }, //初始化组件 components:{ Main } } </script> //子组件通过props方法接受数据 <template> <div>{{data}}</div> </template> <script> exprot default{ name:"son", //接受父组件传值 props:["data"] } </script>
//子组件通过$emit方法传递参数 <template> <div v-on:click="events"></div> </template> <script> //引入子组件 import Main form "./main" exprot default{ methods:{ events:function(){ } } } </script> // <template> <div>{{data}}</div> </template> <script> exprot default{ name:"son", //接受父组件传值 props:["data"] } </script>
active-class 是哪个组件的属性?
嵌套路由怎么定义?
index.html,只有一个路由出口<div id="app"> <!-- router-view 路由出口, 路由匹配到的组件将渲染在这里 --> <router-view></router-view> </div>
import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) //引入两个组件 import home from "./home.vue" import game from "./game.vue" //定义路由 const routes = [ { path: "/", redirect: "/home" },//重定向,指向了home组件 { path: "/home", component: home, children: [ { path: "/home/game", component: game } ] } ] //创建路由实例 const router = new VueRouter({routes}) new Vue({ el: '#app', data: { }, methods: { }, router })
路由之间跳转?
<router-link :to="index">
router.push('index')
懒加载(按需加载路由)(常考)
import home from '../../common/home.vue'
const home = r => require.ensure( [], () => r (require('../../common/home.vue')))
vuex 是什么?怎么使用?哪种功能场景使用它?
// 新建 store.js import vue from 'vue' import vuex form 'vuex' vue.use(vuex) export default new vuex.store({ //...code }) //main.js import store from './store' ...
vue-router 有哪几种导航钩子?
自定义指令(v-check, v-focus) 的方法有哪些? 它有哪些钩子函数? 还有哪些钩子函数参数
说出至少 4 种 vue 当中的指令和它的用法
vue 的双向绑定的原理是什么(常考)
第一步:需要 observe 的数据对象进行递归遍历,包括子属性对象的属性,都加上 setter 和 getter 这样的话,给这个对象的某个值赋值,就会触发 setter,那么就能监听到了数据变化
vuex 相关
vuex 有哪几种属性
vuex 的 store 特性是什么
vuex 的 getter 特性是什么
vuex 的 mutation 特性是什么
vue 中 ajax 请求代码应该写在组件的 methods 中还是 vuex 的 action 中
不用 vuex 会带来什么问题
vuex 原理
使用 Vuex 只需执行 Vue.use(Vuex),并在 Vue 的配置中传入一个 store 对象的示例,store 是如何实现注入的?
store中。因此在VueComponent任意地方都能够通过this.store 访问到该 store。state 内部支持模块配置和模块嵌套,如何实现的?
在执行 dispatch 触发 action(commit 同理)的时候,只需传入(type, payload),action 执行函数中第一个参数 store 从哪里获取的?
Vuex 如何区分 state 是外部直接修改,还是通过 mutation 方法修改的?
调试时的”时空穿梭”功能是如何实现的?
axios
axios 是什么?怎么使用?描述使用它实现登录功能的流程
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算