Vue学习(3)Router,Vuex,构建打包与部署

Router

路由,负责Vue不同组件之间的跳转切换,使单页面应用具有和多页面相同的效果。

安装与导入

推荐在模块化工程中使用,安装时用NPM:

npm install vue-router

要通过 Vue.use() 明确地安装路由功能:

import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter)

基本使用

我们需要做的是:

  1. 将组件 (components) 映射到路由 (routes)
  2. 然后告诉 Vue Router 在哪里渲染它们

html:

<div id="app">
  <h1>Hello App!</h1>
  <p>
    <!-- 使用 router-link 组件来导航. -->
    <!-- 通过传入 `to` 属性指定链接. -->
    <!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
    <router-link to="/Main">Go to Main</router-link>
    <router-link to="/Home">Go to Home</router-link>
  </p>
  <!-- 路由出口 -->
  <!-- 路由匹配到的组件将渲染在这里 -->
  <router-view></router-view>
</div>

js:

// 定义 (路由) 组件。
// 可以从其他文件 import 进来
import Main from '@/views/Main.vue';
import Home from '@/views/Home.vue';

// 注册
// 导入Vue和VueRouter,调用 Vue.use(VueRouter)
import Vue from 'vue';
import VueRouter from 'vue-router';
Vue.use( VueRouter );

// 创建 router 实例,然后传 `routes` 配置
let router = new VueRouter({
  mode: 'history',
  // 所有的路由映射,每一个路由就是一个对象
  routes: [
    {
      // 从 path 找到 component
      path: '/',
      name: 'Main',
      component: Main
    },{
      path: '/home',
      name: 'Home',
      component: Home
    }
  ]
});
// 4. 创建和挂载根实例。
// 记得要通过 router 配置参数注入路由,
// 从而让整个应用都有路由功能
const app = new Vue({
  router
}).$mount('#app')

通过注入路由器,我们可以在任何组件内通过 this.$router 访问路由器,也可以通过 this.$route 访问当前路由:

  computed: {
    username() {
      // 获取通过路由传入的参数 `params` 
      return this.$route.params.username
    }
  },
  methods: {
    goBack() {
      window.history.length > 1 ? this.$router.go(-1) : this.$router.push('/')
    }
  }

this.$router指代的就是我们上面创建的router实例。

Vuex

Vuex 可以帮助我们管理共享状态,使数据信息可以在多个页面中共享。也可以全局地存储网络响应等异步资源。相当于全局变量加一组专门的控制器。

安装与导入

推荐在模块化工程中使用,安装时用NPM:

npm install vuex

要通过 Vue.use() 明确地安装Vuex:

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

基本使用

声明数据

// 注册
// 导入Vue和Vuex,调用 Vue.use(Vuex)
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use( Vuex );

// 构建仓库
let store = new Vuex.Store({
    // 数据存储的位置,和组件的data一样,也是响应式的
    state: {
        // a: [1,2,3]
        a: 1,
        user: {
            name: '名字'
        }
    },
})

获取数据

在组件中可使用this.$store.state取到上面state对象,获取其中的数据就像取普通对象一样。通常要在组件的计算属性中使用这个state对象:

// ...
    computed: {
        username() {
            return this.$store.state.user.name
        }
    },
// ...

存储数据

更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。mutation只支持同步,若要进行异步操作,要配合action使用。

  • Mutation定义:
const store = new Vuex.Store({
  state: {
    count: 1
  },
mutations: {
  increment (state, payload) {
    state.count += payload.amount
  }
}
})

参数state就代表上面的state,载荷payload可传需要的数据,也可省略payload

  • Mutation调用:
this.$store.commit('increment', {
  amount: 10
})

第一个字符串参数是定义在mutations中的函数名,第二个参数可以是任何基本类型的数据。

  • Action定义:
const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state, payload) {
      state.count++
    }
  },
  actions: {
    increment (store, payload) {
        setTimeout(() => {
          store.commit('increment', payload)
       }, 1000)
    }
  }
})

Action是在内部调用Mutation的,这样就支持了异步操作。甚至可以在Action中执行多个Mutation。传入的第一个参数是本store实例,第二个是和Mutation同样用法的载荷。

  • Action调用:
store.dispatch('increment', data)

调用也和Mutation有些类似也有些不同。

构建打包与部署

1、打包

开发过程中,用到的东西并不会在实际运行过程中都需要,比如 webpack、eslint、typescript等

打包:把项目运行过程中的资源进行整理(编译、解析……过程)

vue-cli项目创建时自带打包配置信息,使用 build 命令即可完成打包:

yarn build
# or
npm run build

直接打包的话只生成两个js文件,这两个文件的体积会特别大,影响线上响应的速度。
可改为分包按需加载(懒加载)的配置,只需要将所有的import改为以下这样的格式:

const Main = () => import('@/views/Main.vue');
const Detail = () => import('@/views/Detail.vue');
const Login = () => import('@/views/Login.vue');
const Register = () => import('@/views/Register.vue');
const User = () => import('@/views/User.vue');
const UserProfile = () => import('@/views/User/Profile.vue');
const UserCart = () => import('@/views/User/Cart.vue');

打包完成后即是多个js文件,而且按需加载。

2、部署

把代码放到各种不同的环境下运行

  • 本地部署
  • 测试环境部署
  • 生产环境部署

无论何种环境,首先我们需要准备(搭建)一个用来提供web服务的WebServer

3、WebServer 的搭建

使用服务器工具:

  • nodejs
  • nginx
  • apache
  • iis
  • ……
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354