Vue10-实战快速上手

创建工程

注意:命令行都要使用管理员模式运行

1、创建一个名为hello-vue的工程vue init webpack hello-vue

2、安装依赖,我们需要安装 vue-routerelement-uisass-loadernode-sass四个插件

#进入工程目录
cd hello-vue
#安装vue-routern  
npm install vue-router --save-dev
#安装element-ui
npm i element-ui -S
#安装依赖
npm install
# 安装SASS加载器
cnpm install sass-loader node-sass --save-dev
#启功测试
npm run dev

创建登录页面

1、把没有用的初始化东西删掉!

2、在源码目录中创建如下结构:

  • assets:用于存放资源文件
  • components:用于存放Vue功能组件
  • views:用于存放Vue视图组件
  • router:用于存放vue-router配置

最终目录结构如图所示:

Vue10-实战快速上手

3、创建首页视图,在views目录下创建一个名为Main.vue的视图组件

<template>
  <h1>首页</h1>
</template>

<script>
export default {
  name: "Main"
}
</script>

<style scoped>

</style>

4、创建登录页视图,在views目录下创建一个名为Login.vue的视图组件,其中el-form的元素为ElementUI组件

<template>
  <div>
    <el-form ref="loginForm" :model="form" :rules="rules" label-width="80px" class="login-box">
      <h3 class="login-title">欢迎登录</h3>
      <el-form-item label="账号" prop="username">
        <el-input type="text" placeholder="请输入账号" v-model="form.username"/>
      </el-form-item>
      <el-form-item label="密码" prop="password">
        <el-input type="password" placeholder="请输入密码" v-model="form.password"/>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" v-on:click="onSubmit(‘loginForm‘)">登录</el-button>
      </el-form-item>
    </el-form>

    <el-dialog
      title="温馨提示"
      :visible.sync="dialogVisible"
      width="30%">
      <span>请输入账号和密码</span>
      <span slot="footer" class="dialog-footer">
        <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
      </span>
    </el-dialog>
  </div>
</template>

<script>
export default {
  name: "Login",
  data() {
    return {
      form: {
        username: ‘‘,
        password: ‘‘
      },

      // 表单验证,需要在 el-form-item 元素中增加 prop 属性
      rules: {
        username: [
          {required: true, message: ‘账号不可为空‘, trigger: ‘blur‘}
        ],
        password: [
          {required: true, message: ‘密码不可为空‘, trigger: ‘blur‘}
        ]
      },

      // 对话框显示和隐藏
      dialogVisible: false
    }
  },
  methods: {
    onSubmit(formName) {
      // 为表单绑定验证功能
      this.$refs[formName].validate((valid) => {
        if (valid) {
          // 使用 vue-router 路由到指定页面,该方式称之为编程式导航
          this.$router.push("/main");
        } else {
          this.dialogVisible = true;
          return false;
        }
      });
    }
  }
}
</script>

<style lang="scss" scoped>
.login-box {
  border: 1px solid #DCDFE6;
  width: 350px;
  margin: 180px auto;
  padding: 35px 35px 15px 35px;
  border-radius: 5px;
  -webkit-border-radius: 5px;
  -moz-border-radius: 5px;
  box-shadow: 0 0 25px #909399;
}

.login-title {
  text-align: center;
  margin: 0 auto 40px auto;
  color: #303133;
}
</style>

5、创建路由,在router目录下创建一个名为 index.js 的vue-router路由配置文件

import Vue from "vue";
import VueRouter from "vue-router";
import Main from "../views/Main";
import Login from "../views/Login";

Vue.use(VueRouter);

export default new VueRouter({
  routes: [
    {
      path:‘/main‘,
      component:Main
    },
    {
      path:‘/login‘,
      component:Login
    }
  ]
})

6、APP.vue

<template>
  <div id="app">
    <router-view></router-view>
  </div>
</template>

<script>

export default {
  name: ‘App‘
}
</script>

7、main.js

import Vue from ‘vue‘
import App from ‘./App‘
import router from ‘./router‘;
import ElementUI from ‘element-ui‘;
import ‘element-ui/lib/theme-chalk/index.css‘;

Vue.use(ElementUI);

new Vue({
  el: ‘#app‘,
  router,
  render: h => h(App) // ElementUI
})

运行项目

1、输入命令

npm run dev

2、如果报错类似:Module build failed: TypeError: loaderContext.getResolve is not a function(sass-loader版本太高)

解决:

 npm uninstall sass-loader node-sass
 npm install sass-loader@7.3.1 node-sass@4.14.1 --save-dev

3、再次执行npm run dev,终于成功

Vue10-实战快速上手

Vue10-实战快速上手

路由嵌套

嵌套路由又称为子路由,在实际应用中,通常由多层嵌套的组件组合而成。同样的,URL中各段动态路径也按某种结构对应嵌套的各层组件

/user/foo/profile                     /user/foo/posts
+------------------+                  +-----------------+
| User             |                  | User            |
| +--------------+ |                  | +-------------+ |
| | Profile      | |  +------------>  | | Posts       | |
| |              | |                  | |             | |
| +--------------+ |                  | +-------------+ |
+------------------+                  +-----------------+

1、用户信息组件,在 views/user 目录下创建一个名为Profile.vue的视图组件

<template>
  <h1>个人信息</h1>
</template>

<script>
export default {
  name: "UserProfile"
}
</script>

<style scoped>

</style>

2、用户列表组件,在 views/user 目录下创建一个名为List.vue的视图组件

<template>
  <h1>用户列表</h1>
</template>

<script>
export default {
  name: "UserList"
}
</script>

<style scoped>

</style>

3、配置嵌套路由,修改 router 目录下的 index.js 路由配置文件,代码如:

import Vue from "vue";
import VueRouter from "vue-router";
import Main from "../views/Main";
import Login from "../views/Login";
import UserList from "../views/user/List"
import UserProfile from "../views/user/Profile"

Vue.use(VueRouter);

export default new VueRouter({
  routes: [
    {
      path: ‘/main‘,
      component: Main,
      children: [
        { // 嵌套路由
          path: ‘/user/profile‘,
          component: UserProfile
        }, {
          path: ‘/user/list‘,
          component: UserList
        }
      ]
    },
    {
      path: ‘/login‘,
      component: Login
    }
  ]
})

4、修改首页视图,我们修改 Main.vue 视图组件,此处使用了 ElementUI 布局容器组件,代码如下:

<template>
  <div>
    <el-container>
      <el-aside width="200px">
        <el-menu :default-openeds="[‘1‘]">
          <el-submenu index="1">
            <template slot="title"><i class="el-icon-caret-right"></i>用户管理</template>
            <el-menu-item-group>
              <el-menu-item index="1-1">
                <router-link to="/user/profile">个人信息</router-link>
              </el-menu-item>
              <el-menu-item index="1-2">
                <router-link to="/user/list">用户列表</router-link>
              </el-menu-item>
            </el-menu-item-group>
          </el-submenu>
          <el-submenu index="2">
            <template slot="title"><i class="el-icon-caret-right"></i>内容管理</template>
            <el-menu-item-group>
              <el-menu-item index="2-1">分类管理</el-menu-item>
              <el-menu-item index="2-2">内容列表</el-menu-item>
            </el-menu-item-group>
          </el-submenu>
        </el-menu>
      </el-aside>

      <el-container>
        <el-header style="text-align: right; font-size: 12px">
          <el-dropdown>
            <i class="el-icon-setting" style="margin-right: 15px"></i>
            <el-dropdown-menu slot="dropdown">
              <el-dropdown-item>个人信息</el-dropdown-item>
              <el-dropdown-item>退出登录</el-dropdown-item>
            </el-dropdown-menu>
          </el-dropdown>
        </el-header>

        <el-main>
          <router-view/>
        </el-main>
      </el-container>
    </el-container>
  </div>
</template>

<script>
export default {
  name: "Main"
}
</script>

<style scoped lang="scss">
.el-header {
  background-color: #02c2fa;
  color: #333;
  line-height: 60px;
}

.el-aside {
  color: #333;
}
</style>

5、运行项目,点击个人信息/用户列表,相关内容会在右侧展示,最终效果如图:

Vue10-实战快速上手

参数传递

我们经常需要把某种模式匹配到的所有路由,全都映射到同个组件。例如,我们有一个User组件,对于所有 ID 各不相同的用户,都要使用这个组件来渲染。此时我们就需要传递参数了;

$route方式

1、修改路由配置

主要是在 path 属性中增加了 :id,:name 这样的占位符

{
  path: ‘/main‘,
  component: Main,
  children: [
    { // 嵌套路由
      path: ‘/user/profile/:id/:name‘,
      name: ‘UserProfile‘,
      component: UserProfile
    }, {
      path: ‘/user/list‘,
      component: UserList
    }
  ]
}

2、传递参数

此时我们将 to 改为了 :to,是为了将这一属性当成对象使用;

注意:router-link 中的name属性名称一定要和路由中的name属性名称匹配,因为这样Vue才能找到对应的路由路径;

<!--name:传组件名 params:传递参数 需要对象:v-bind-->
<router-link :to="{name:‘UserProfile‘,params:{id:1,name:‘edgar‘}}">个人信息</router-link>

3、接收参数,在目标组件中

<template>
  <!--所有的元素,必须不能直接在根节点下-->
  <div>
    <h1>个人信息</h1>
    {{ $route.params.id }}
    {{ $route.params.name }}
  </div>
</template>

<script>
export default {
  name: "UserProfile"
}
</script>

<style scoped>

</style>

4、启动项目,测试效果如图:

Vue10-实战快速上手

使用 props 的方式

1、修改路由配置,主要增加了 props: true 属性

{
  path: ‘/main‘,
  component: Main,
  children: [
    { // 嵌套路由
      path: ‘/user/profile/:id/:name‘,
      name: ‘UserProfile‘,
      component: UserProfile,
      props: true
    }, {
      path: ‘/user/list‘,
      component: UserList
    }
  ]
}

2、传递参数和之前一样

3、接收参数为目标组件增加 props 属性

<template>
  <!--所有的元素,必须不能直接在根节点下-->
  <div>
    <h1>个人信息</h1>
    {{id}}
    {{name}}
  </div>
</template>

<script>
export default {
  props:[‘id‘,‘name‘],
  name: "UserProfile"
}
</script>

<style scoped>

</style>

4、启动项目,测试效果和之前一样,成功~

组件重定向

重定向的意思大家都明白,但 Vue 中的重定向是作用在路径不同但组件相同的情况下,比如:

{
	path: ‘/main‘,
	component: Main,
},
{
	path: ‘/goHome‘,
	redirect:‘/main‘
}

说明:这里定义了两个路径,一个是 /main ,一个是 /goHome

其中 /goHome 重定向到了 /main 路径,由此可以看出重定向不需要定义组件;

使用的话,只需要设置对应路径即可;

<el-menu-item index="1-3">
  <router-link to="/goHome">回到首页</router-link>
</el-menu-item>

路由模式与 404

路由模式有两种:

hash:路径带 # 符号,如 http://localhost/#/login

vue-router 默认 hash 模式

export default new Router({
  routes: []
})

history:路径不带 # 符号,如 http://localhost/login

history路由模式

export default new Router({
  mode: ‘history‘,
  routes: []
})

404

1、创建一个名为 NotFound.vue 的视图组件,代码如下:

<template>
  <h1>404,你的页面走丢了</h1>
</template>

<script>
export default {
  name: "NotFound"
}
</script>

<style scoped>

</style>

2、修改路由配置,代码如下:

import NotFound from "../views/NotFound"

export default new Router({
  mode: ‘history‘,
  routes: [
	{
       path: ‘*‘,
       component: NotFound
    }
  ]
})

路由钩子与异步请求

路由钩子

  • beforeRouteEnter:在进入路由前执行
  • beforeRouterLeave:在离开路由前执行
export default {
  props:[‘id‘,‘name‘],
  name: "UserProfile",
  beforeRouteEnter:(to, from, next) => {
    console.log(‘进入路由之前‘);
    next();
  },
  beforeRouteLeave:(to, from, next) => {
    console.log(‘离开路由之前‘);
    next();
  }
}

参数说明:

  • to:路由将要跳转的路径信息
  • from:路由跳转前的路径信息
  • next:路由的控制参数
    • next() 跳入下一个页面
    • next(‘/path‘) 改变路由的跳转方向,使其跳到另一个路由
    • next(false) 返回原来的页面
    • next(vm => {}) 仅在 beforeRouteEnter 中可用,vm是组件实例

在钩子函数中使用异步请求

1、安装 Axios npm install --save axios vue-axios

2、main.js 引用 Axios

import Vue from ‘vue‘
import axios from ‘axios‘
import VueAxios from ‘vue-axios‘

Vue.use(VueAxios, axios)

3、准备数据:只有我们的 static 目录下的文件是可以被访问到的,所以我们就把静态文件放入该目录下 static/mock/data.json

{
  "name": "Edgar学Java",
  "url": "https://home.cnblogs.com/u/edgarstudy/",
  "page": 1,
  "isNonProfit": true,
  "address": {
    "street": "含光门",
    "city": "陕西西安",
    "country": "中国"
  },
  "links": [
    {
      "name": "bilibili",
      "url": "https://space.bilibili.com/95256449"
    },
    {
      "name": "狂神说Java",
      "url": "https://blog.kuangstudy.com"
    },
    {
      "name": "百度",
      "url": "https://www.baidu.com/"
    }
  ]
}

4、运行项目npm run dev看是否正常

Vue10-实战快速上手

测试OK~

5、在 beforeRouteEnter 中进行异步请求

export default {
  props:[‘id‘,‘name‘],
  name: "UserProfile",
  beforeRouteEnter:(to, from, next) => {
    console.log(‘进入路由之前‘);
    // 加载数据
    next(vm => {
      vm.getData()
    });
  },
  beforeRouteLeave:(to, from, next) => {
    console.log(‘离开路由之前‘);
    next();
  },
  methods:{
    getData:function () {
      this.axios.get(‘http://localhost:8080/static/mock/data.json‘).then((response) => {
        console.log(response.data)
      })
    }
  }

}

Vue10-实战快速上手

上一篇:设计模式


下一篇:第一章 绪论