接上文,src文件夹是项目核心文件夹,所有的代码都放在这个文件夹下面。

代码结构如下:

hello-world
|
|-- public
|-- |-- favicon.ico                  //网站图标
|-- |-- index.html                   //入口页面
|-- src   
    |-- assets                       // 静态文件,比如一些图片,json数据等
|   |-- components                   // vue公共组件
    |-- views                        // 以页面为单位的vue文件、html文件等
|   |-- App.vue                      // 页面入口文件
|   |-- main.js                      // 程序入口文件,加载各种公共组件
|   |-- router.js                    // vue的路由管理
|   |-- store.js                     // vuex

1)App.vue

App.vue类似于一般网站的母板页,App.vue中包含导航(<router-link> )和子视图(<router-view>),通过点击导航切换子视图的主体内容,子视图一般会放在views文件夹下。代码如下:

<template>
  <div id="app">
    <div id="nav">
        <!-- 使用 router-link 组件来导航. -->
        <!-- 通过传入 `to` 属性指定链接. -->
        <!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
        <router-link to="/">Home</router-link> |
        <router-link to="/about">About</router-link>
    </div>

    <!-- 路由出口 -->
    <!-- 路由匹配到的组件将渲染在这里 -->
    <router-view/>
  </div>
</template>

<style lang="less">
   。。。
</style>

 

<router-link> 组件支持用户在具有路由功能的应用中 (点击) 导航。 通过 to 属性指定目标地址,默认渲染成带有正确链接的 <a> 标签,可以通过配置 tag 属性生成别的标签.。

<router-view> 组件是一个 functional 组件,渲染路径匹配到的视图组件。

 

2)main.js——程序入口

import Vue from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';

Vue.config.productionTip = false;

new Vue({
  router,
  store,
  render: h => h(App),
}).$mount('#app');

因为我们前面的章节并不会涉及到状态管理,因此暂时注释掉对store的调用:

import Vue from 'vue';
import App from './App.vue';
import router from './router';

Vue.config.productionTip = false;

new Vue({
  router,    //(缩写) 相当于 router: router
  render: h => h(App),
}).$mount('#app');

实例化Vue,传入两个属性 router和render。这里因为我们通过import引入的router和属性名重名了,造成预期的属性需要缩写。如果写成router: router,eslint会提示这一行代码有坏味道,因为您本可以使用缩写的,如下:

Module Warning (from ./node_modules/eslint-loader/index.js):
error: Expected property shorthand (object-shorthand) at src\main.js:9:3:
   7 |
   8 | new Vue({
>  9 |   router: router,
     |   ^
  10 |   render: h => h(App),
  11 | }).$mount('#app');

 

这里我们索性再搞一个重名,实例化的时候,把两个属性都用缩写,最终的代码如下:

import Vue from 'vue';
import App from './App.vue';
import router from './router';

Vue.config.productionTip = false;

const render = h => h(App);

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

脚手架在router.js文件中定义路由

import Vue from 'vue';
import Router from 'vue-router';
import Home from './views/Home.vue';

Vue.use(Router);

export default new Router({
  mode: 'history',
  base: process.env.BASE_URL,
  routes: [
    {
      path: '/',
      name: 'home',
      component: Home,
    },
    {
      path: '/about',
      name: 'about',
      // route level code-splitting
      // this generates a separate chunk (about.[hash].js) for this route
      // which is lazy-loaded when the route is visited.
      component: () => import(/* webpackChunkName: "about" */ './views/About.vue'),
    },
  ],
});

并在main.js通过import引入, 

import router from './router'

 

这里,为了便于讲解,我们把这行代码去掉,将rouer.js中的实现拿过来,直接放到main.js里,将这两个文件合二为一:

import Vue from 'vue';
import Router from 'vue-router';
import Home from './views/Home.vue';
import App from './App.vue';

Vue.config.productionTip = false;

Vue.use(Router);

// 1. 定义路由
// 每个路由应该映射一个组件。 其中"component" 可以是
// 通过 Vue.extend() 创建的组件构造器,
// 或者,只是一个组件配置对象。
const routes= [
  {
    path: '/',
    name: 'home',
    component: Home,
  },
  {
    path: '/about',
    name: 'about',
    component: () => import('./views/About.vue'),
  },
];

// 2. 创建 router 实例,传入上面定义的 `routes` 配置
const router = new Router({
  mode: 'history',
  base: process.env.BASE_URL,
  routes: routes,
});

// 3.通过render渲染主组件App
const render = h => h(App);

// 4. 创建和挂载根实例。
// 通过 router 配置参数注入路由,从而让整个应用都有路由功能
new Vue({
  router,
  render,
}).$mount('#app');

现在就可以很容易的弄清整个实例化过程了。

 

通过代码,我们可以了解到main.js大致的功能:

main.js通过import将一个Vue.js的组件文件引入,并创建一个Vue实例,在构造函数中,通过 router 配置参数注入路由,从而让整个应用都有路由功能,用render配置参数来绘制App主组件,并将实例化后的Vue挂载到index.html中的 <div id="app"></div>这个dom元素。

           现在应用就可以启动了。

 

 

 

 

Logo

前往低代码交流专区

更多推荐