Vue

鉴于国内vue火热的现状无法冷却,准备面试的我重新抱起vue的大腿...

vue之所以如此火热也是有原因的:

1.压缩后代码量少

2.采用MVVM模式,实现双向绑定

3.组件耦合度低,使用更灵活

4.优秀的官方文档

5.官方提供脚手架,如vue-cli,构建项目方便简单

按照国际惯例:先看一遍官方文档吧。

嗯,囫囵吞枣地复习一遍,就迫不及待地上github找项目去了。

这个star好多,就了。

半晌,稍微地掀了下ta的面纱,已感觉眼花缭乱的。

好在,作者的remake里有曙光,我翻译了一下:吾项目甚吊,汝若蠢,以此径观,何如?

曰: 可。

git clone https://github.com/bailicangdu/vue2-happyfri.git  

cd vue2-happyfri

yarn install

npm run dev

嗯..先找入口文件,看看都有些啥:

import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './router/router' //路由集
import store from './store/' //状态集
import ajax from './config/ajax'
import './style/common'
import './config/rem'

Vue.use(VueRouter)
const router = new VueRouter({
  routes
})

new Vue({
  router,
  store,
}).$mount('#app')

下一步便看看routes里面有啥:

router.js

import App from '../App'

export default [{ //仅有3个路由,require.ensure是webpack的按需加载语法
    path: '/',
    component: App,
    children: [{
        path: '',
        component: r => require.ensure([], () => r(require('../page/home')), 'home')
    }, {
        path: '/item',
        component: r => require.ensure([], () => r(require('../page/item')), 'item')
    }, {
        path: '/score',
        component: r => require.ensure([], () => r(require('../page/score')), 'score')
    }]
}]

看完路由顺便看看对应组件:

home组件

<template>
  <div class="home_container">
    <!-- 嗯,给itemcontainer组件定义了一个属性,值为home -->
    <itemcontainer father-component="home"></itemcontainer>
  </div>
</template>

<script>
import itemcontainer from '../../components/itemcontainer'

export default {
  name: 'home', //类似命名空间,用name属性来分配组件名称,应该是这样
  components: { //声明或注册子组件?
    itemcontainer
  },
  created(){}
}
</script>

为节省篇幅,以下组件内类似的内容又不重要的就过滤掉

item组件

  created(){
    this.$store.commit('REMBER_TIME'); //类似redux的dispatch(action)方法,Vuex.Store()方法会侦听commit触发的事件,更新state;
    //$store属于Vue原型对象的属性(应该是vuex挂在在Vue原型上的);
  }

score组件

import {mapState} from 'vuex';
export default {
  name: 'score',
  data() {
    ...
  },
  computed: mapState(['answerid']), //获取store.state.answerid并映射到this.answerid
  created(){
    ...
  },
}

itemcontainer组件

import { mapState, mapActions } from 'vuex'
export default {
  name: 'itemcontainer',
  data() {
  ...
  },
  props:['fatherComponent'], //注册子组件时,想从父组件获取数据,使用props属性
  methods: {
    ...mapActions([
      'addNum', 'initializeData', //将组件的 methods 映射为 store.dispatch 调用
    ]),
    nextItem(){
      if (this.choosedNum !== null) {
        ...
        this.addNum(this.choosedId) //跟踪一下this.$store.dispatch('addNum')
        ...
    },
    ...
  }
}

store/action.js

export default {
  addNum({ commit, state }, id) {
    commit('REMBER_ANSWER', id); //派发 REMBER_ANSWER, 带一个参数
    ...
  },
  ...
}

store/mutations.js

const REMBER_ANSWER = 'REMBER_ANSWER'
export default {
  [REMBER_ANSWER](state, id) {
    state.answerid.push(id); //更新state
  },
  ...
}

总结一哈:

用vue、vue-router、vuex走一遍流程的项目,麻雀虽小,五脏俱全。作者所言不虚。