vue/react/webpack/node/模块化

VUE

Vue的执行流程,什么时候更新,代码的输出结果

理解

渐进式的JS框架。
易用,灵活,高效
构建用户界面的声明式框架,只关心图层,不关心是如何实现的

computed,watch

  • computed(计算属性)
    对于任何复杂逻辑,你都应当使用计算属性
    <div id="example">
    <p>Original message: "{{ message }}"</p>
    <p>Computed reversed message: "{{ reversedMessage }}"</p>
    </div>
    var vm = new Vue({
    el: '#example',
    data: {
      message: 'Hello'
    },
    computed: {
      // 计算属性的 getter
      reversedMessage: function () {
        // `this` 指向 vm 实例
        return this.message.split('').reverse().join('')
      }
    }
    })
  • computed vs methods

某种程度上效果相同,区别在于缓存与否

computed属性:
计算属性是基于它们的响应式依赖进行缓存的。
只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数

方法使用:
不进行缓存;
每次触发渲染时都要再次执行函数

<p>Reversed message: "{{ reversedMessage() }}"</p>

watch(侦听器)
更通用的方式来观察和响应 Vue 实例上的数据变动

虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器;
当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的

 watch: {
    // 如果 `question` 发生改变,这个函数就会运行
    question: function (newQuestion, oldQuestion) {
      this.answer = 'Waiting for you to stop typing...'
      this.debouncedGetAnswer()
    }
  },

使用 watch 选项允许我们执行异步操作 (访问一个 API),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态。这些都是计算属性无法做到的。

watch(侦听属性)vs computed

相同: computed和watch都起到监听/依赖一个数据,并进行处理的作用

异:它们其实都是vue对监听器的实现,只不过computed主要用于对同步数据的处理,watch则主要用于观测某个值的变化去完成一段开销较大的复杂业务逻辑。

能用computed的时候优先用computed,避免了多个数据影响其中某个数据时多次调用watch的尴尬情况。

var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar',
    fullName: 'Foo Bar'
  },
  watch: {
    firstName: function (val) {
      this.fullName = val + ' ' + this.lastName
    },
    lastName: function (val) {
      this.fullName = this.firstName + ' ' + val
    }
  }
})

改为computed:

var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar'
  },
  computed: {
    fullName: function () {
      return this.firstName + ' ' + this.lastName
    }
  }
})

Vue-Router(路由)

SPA(单页应用)的路径管理器,WebApp的链接路径管理系统

vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来
传统的页面应用,是用一些超链接来实现页面切换和跳转的。在vue-router单页面应用中,则是路径之间的切换,也就是组件的切换

使用 Vue.js ,我们已经可以通过组合组件来组成应用程序,当你要把 Vue Router 添加进来,我们需要做的是,将组件 (components) 映射到路由 (routes),然后告诉 Vue Router 在哪里渲染它们。

Vue-Router两种模式

  • Hash(默认)
    url中的#符号(不是散列值),不被包含在http请求

使用 URL 的 hash 来模拟一个完整的 URL,于是当 hash 改变时,页面不会重新加载;
hash(#)是URL 的锚点,代表的是网页中的一个位置,单单改变#后的部分,浏览器只会滚动到相应位置,不会重新加载网页;
每一次改变#后的部分,都会在浏览器的访问历史中增加一个记录,使用”后退”按钮,就可以回到上一个位置

  • History
    配置路由规则时,加入"mode: 'history'"

这种模式充分利用HTML5 API: history.pushState,history.replaceState()方法来完成 URL 跳转而无须重新加载页面

$router vs $route

  • $router:路由实例对象,包含Router的跳转方法,钩子函数等;
  • $route: 路由信息对象,包括path, params, hash, query, fullPath, matcher, name等路由信息参数

v-model原理

Vue的双向数据绑定是由数据劫持结合发布订阅者实现的

数据劫持:通过Object.definedProperty()来劫持对象数据的settergetter操作,在数据变动时发布消息给订阅者,订阅者收到消息后进行相应的处理

  1. Compile指令解析系统

    对每个元素节点的指令进行扫描和解析,根据指令模板替换数据,绑定相应的更新函数

2.Observer数据监听系统

对数据对象的所有属性进行监听,如有变动拿到最新值并通知订阅者

3.Dep+Watcher发布订阅模型
作为连接Observer和Compile的桥梁,能够订阅并收到每个属性变动的通知,执行指令绑定的响应回调函数,从而更新视图

Dep是发布订阅模型中的发布者:
get数据的时候,收集订阅者,触发watcher的依赖收集;
set数据的时候,发布更新,通知watcher。
一个Dep实例对应一个对象属性或一个被观察的对象,用来收集订阅者和发布更新

watcher是订阅者
订阅的数据改变时执行相应的回调函数(更新视图或表达式的值)
一个watcher可以更新视图(模板),也可以执行watch监督的值的回调函数,还可以更新computed


webpack

webpack的配置和plugins

node

node有哪些特征,对比其他服务器端

特征:单线程,事件驱动,非阻塞I/O
无法直接渲染静态页面、提供静态服务;
没有根目录的概念;
必须通过路由器程序指定文件才能渲染文件

比其他服务器端性能更好、速度更快

模块化

CommonJS

AMD

CMD

ES6 module

CommonJS require/export和ES6 import/export的区别

CommonJS模块的重要特征是加载时执行
即require的时候就会全部执行
还没有执行的部分是不输出的

ES6模块是动态引用
即import时变量不会被缓存,而是指向被加载模块的引用;
import/export最终是被编译为require/export来执行的

全部评论

相关推荐

数开小菜鸡:你是我今早见过的最美的牛客女孩......
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务