关于VueRouter导入的全过程

目录
  • router
    • nanoid的使用
    • 引入
    • 使用
  • 路由
    • 1-1 安装依赖
    • 1-2 引入
    • 1-3 在main.js中使用
    • 1-4 App.vue
  • 全局过滤器
  • element-ui
  • 全局组件
  • Vuc-cli中的视配
    • 1-1 安装依赖
    • 1-2 配置文件
    • 1-3 main.js
    • 1-4 public/index.html
    • 1-5 在pc端视配
  • slot封装动画
  • 项目初始化
    • 1-1 .router-link-active
    • 1-2 动态显示tabbar
    • 1-3 跳转回前一个页面
    • 1-4轮播
  • vant ui的按需导入
    • 1-1 安装依赖
    • 1-2 配置babel.config.js
    • 1-3 配置main.js
  • 嵌套路由
    • 1-1 router.js
    • 1-2 index.vue
  • 异步路由​
  • 页面跳转和生命周期
    • 页面跳转
  • DOM和生命周期
  • 缓存的进一步封装
  • axios
    • 跨域
    • 地址值的放置
  • Vuex
    • 1、state
    • 2、mutation
    • 3、actions
  • keep-alive
  • 路由守卫
  • Login_guard(Vue&koa)
    • 一、登录页面
    • 二、后台代码
    • 三、配置cookie跨域访问
  • 懒加载
    • 1、图片懒加载
    • 2、axios拦截器
    • 3、上拉刷新
    • 4、路由滚动记录当前滚动条位置问题​
  • Vue路由跳转的bug

router

nanoid的使用

​ --生成随机id

引入

yarn add nanoid

使用

import {nanoid} from 'nanoid'
var id = nanoid()

路由

1-1 安装依赖

yarn add vue-router

1-2 引入

router/index.js

import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
import Movie from '../pages/Movie/index.vue'
import Music from '../pages/Music/index.vue'
const routes = [
  {
    path:"/music",
    component:Music
  },
  {
    path:"/movie",
    component:Movie
  }
]
const router = new VueRouter({
  routes,
  mode:"history"
})
export default router;

1-3 在main.js中使用

import Vue from 'vue'
import App from './App.vue'
import router from './router'
Vue.config.productionTip = false
new Vue({
  router,
  render: h => h(App),
}).$mount('#app')

1-4 App.vue

<template>
  <div>
    <router-view></router-view>
  </div>
</template>

全局过滤器

在main.js中挂载在Vue原型上

Vue.filter("handleStr",function(val){
  if(val.length > 3){
    val = val.slice(0,3) + '...'
  }
  return val
})

element-ui

安装依赖

yarn add element-ui

main.js

....
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);
...

全局组件

import Loading from '../components/Loading.vue'
Vue.component("Loading",Loading)

Vuc-cli中的视配

只在手机端

lib-flexible 阿里

1-1 安装依赖

yarn add lib-flexible postcss-pxtorem@5.1.1

1-2 配置文件

新建postcss.config.js

module.exports = {
  plugins: {
    'postcss-pxtorem': {
      rootValue: 75,
      propList: ['*'],
    },
  },
};

1-3 main.js

导入lib-flexible

import 'lib-flexible/flexible.js'

1-4 public/index.html

将此行注释,关闭视口

<meta name="viewport" content="width=device-width,initial-scale=1.0">

1-5 在pc端视配

<template>
  <div id="app">
    ...
  </div>
</template>
<script>
    ...
</script>
<style>
*{
  margin: 0;
  padding: 0;
}
#app{
  width: 10rem;
  margin: 0 auto;
  background-color: red;
}
</style>

slot封装动画

// #1 定义一个组件
<template>
  <transition>
    <slot name="fade"></slot>
  </transition>
</template>
<script>
export default {
}
</script>
<style>
.v-enter,.v-leave-to{
  opacity: 0;
}
.v-enter-active,.v-leave-active{
  transition: opacity 4s;
}
</style>
// #2 使用
<template>
  <div class="about">
    <Fade>
      <h1 slot="fade" v-show="isShow">This is an about page</h1>
    </Fade>
  </div>
</template>
<script>
import Fade from '../components/Fade.vue'
export default {
  data() {
    return {
      isShow:true
    }
  },
  components:{
    Fade
  }
}
</script>

项目初始化

1、rem
2、asssreset.css

1-1 .router-link-active

被选中的路由样式

.router-link-active{
    color: #ff2d51;
  }

1-2 动态显示tabbar

​ – 在路由配置中增加一条meta属性

const routes = [
  {
    path: '/films',
    name: 'Films',
    component:Films,
    meta:{
      isNav:true
    }
  },
  {
    path: '/article',
    name: 'Article',
    component:Article,
    meta:{
      isNav:true
    }
  },
  {
    path: '/center',
    name: 'Center',
    component:Center,
    meta:{
      isNav:true
    }
  },
  {
    path:"/movie/:id",
    name:'MovieDetail',
    component:MovieDetail
  }
]

通过v-if动态显示

<tab-bar v-if="this.$route.meta.isNav"></tab-bar>

1-3 跳转回前一个页面

this.$router.back()

1-4轮播

yarn add vue-preview
import VuePreview from 'vue-preview'
Vue.use(VuePreview)

vant ui的按需导入

1-1 安装依赖

yarn add vant babel-plugin-import

1-2 配置babel.config.js

module.exports = {
  presets: [
    '@vue/cli-plugin-babel/preset'
  ],
  plugins: [
    ["import", {
      "libraryName": "vant",
      "libraryDirectory": "es",
      "style": true
    }]
  ]
}

1-3 配置main.js

import {Button} from 'vant'
Vue.use(Button)

router-view实现动画

<template>
  <div>
    <div class="cover" v-if="isShow"></div>
    <transition 
      @before-enter="handleBeforeEnter"
      @enter="handleEnter"
    >
      <slot></slot>
    </transition>
  </div>
</template>
<script>
/* 
.v-enter              @before-enter
.v-ernter-active      @enter
.v-enter-to           @after-enter
*/
  export default {
    data() {
      return {
        isShow:false
      }
    },
    methods:{
      handleBeforeEnter(){
        this.isShow = true
      },
      handleEnter(){
        setTimeout(() => {
          this.isShow = false
        }, 200);
      }
    }
  }
</script>
<style>
  .v-enter-active{
    animation: animate 2s linear;
  }
  @keyframes animate {
    0%{
      opacity: 0;
      transform: translateY(0px);
    }
    50%{
      opacity: .5;
      transform: translateY(20px);
    }
    100%{
      opacity: 1;
      transform: translateY(0px);
    }
  }
  .cover{
    width: 100%;
    height: 100%;
    background-color: #fff;
    position: fixed;
    z-index: 10;
  }
</style>

嵌套路由

1-1 router.js

 {
    path: '/films',
    name: 'Films',
    component:Films,
    meta:{
      isNav:true
    },
    children:[
      {
        path:"nowPlaying",
        component:NowPlaying
      }
    ]
  },

1-2 index.vue

需要加入router-view

<template>
    ...
    <div class="container">
        <!-- 装载父路由下的子路由的对应 -->
        <router-view></router-view>
    </div>
</template>

异步路由​

--又称路由懒加载

{
    path: '/about',
    name: 'About',
    // 异步路由
    component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
},

怎么减少首屏渲染时间

1、使用异步路由

页面跳转和生命周期

​ --面试常客

页面跳转

1-1 A页面初次加载

beforeCreate(){
    console.log('beforeCreate');
},
created(){
    console.log('created');
},
beforeMount(){
    console.log('beforeMount');
},
mounted(){
    console.log('mounted');
},

1-2 A->B

从A页面跳转到B页面

A页面触发以下生命周期

beforeDestroy(){
    console.log('beforeDestroy');
},
destroyed(){
    console.log('destroyed');
}

1-3 B–>A

从B页面回到A页面

A页面触发以下生命周期

beforeCreate(){
    console.log('beforeCreate');
},
created(){
    console.log('created');
},
beforeMount(){
    console.log('beforeMount');
},
mounted(){
    console.log('mounted');
},

upDate

beforeUpdate , beforeUpdate执行需要满足以下两个条件

1、data中的数据更新的时候

2、模板中要使用data中的数据

destroyed

# A页面 --> b页面

b页面执行以下生命周期:

  • 1.beforeCreate        B
  • 2.created            B
  • 3.beforeMount        B
  • 4.beforeDestroy        A
  • 5.destroyed            A
  • 6.mounted            B

DOM和生命周期

只能在mounted生命周期中获取DOM

缓存的进一步封装

localStorage.setItem() 函数会将对象或者数组全部转换成字符串的形式

所以可以对缓存进行判断,使用 JSON.stringify 和 JSON.parse 分别处理数据

const setLocalStorage = (key , value) => {
  if(value instanceof Array || value instanceof Object){
    value = JSON.stringify(value)
  }
  localStorage.setItem(key , value)
}
const getLocalStorage = (key) =>{
  var val = localStorage.getItem(key)
  var reg = /^[[{].*[\]}]/
  if(reg.test(val)){
    val = JSON.parse(val)
  }
  return val
}

axios

跨域

安装依赖

yarn add axios-jsonp

axios格式

import axios from 'axios'
import jsonpAdapter from 'axios-jsonp'
axios({
    url:"",
    adapter: jsonpAdapter,
}).then(
    res => console.log(res)
)

腾讯地图api需要在最后加上 &output=jsonp

https://apis.map.qq.com/ws/location/v1/ip?key=L6UBZ-JSLCU-FRAVA-4DBQG-V5WC5-2RBJ4&output=jsonp

地址值的放置

http://47.108.197.28:3000/top/playlist?limit=1&offset=1

在小程序中

wx.request({
})

axios中

import axios from 'axios'
axios({
    url:"http://47.108.197.28:3000/top/playlist",
    method:"get",
    params:{
    limit:1
    }
}).then(res=>{
    console.log(res)
})

Vuex

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
  state: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})

1、state

​ --state中存放的是数据

state: {
    num:10
}
this.$store.state

2、mutation

​ --mutation中的函数第一个默认参数是state

​ --连接方式 commit

mutations: {
    add(state){
        console.log(state);
        state.num++;
    }
},
this.$store.commit('add')

3、actions

​ --actions中的函数第一个默认值是上下文

​ --连接方式 dispatch

actions: {
    addNum(ctx){
        console.log(ctx);
        ctx.commit("add")
    }
},
this.$store.dispatch('a')

keep-alive

  • 使用keep-alive之后,路由切换的时候,生命周期函数不会重复的触发
  • 组件不会被销毁,而是被缓存起来。当加载到对应的路由页面,缓存的组件会被加载

路由组件的两个生命周期函数

/* 路由组件被激活时触发。 */
activated(){
    console.log('activated')
}
/* 路由组件失活时触发。 */
deactivated(){
    console.log('deactivated')
}

路由守卫

全局路由守卫

router.beforeEach((to , from ,next)=>{
  console.log(to);    // 要跳转的路由
  console.log(from);  // 起点路由
  next();
})

Login_guard(Vue&koa)

一、登录页面

<template>
  <div>
    <el-form
      :model="ruleForm"
      status-icon
      :rules="rules"
      ref="ruleForm"
      label-width="100px"
      class="demo-ruleForm"
    >
    <!-- props为了规则校验 rules -->
    <el-form-item label="用户名" prop="username">
        <el-input  type="text" v-model.number="ruleForm.username"></el-input>
      </el-form-item>
      <el-form-item label="密码" prop="pass">
        <el-input
          type="password"
          v-model="ruleForm.pass"
          autocomplete="off"
        ></el-input>
      </el-form-item>
      <el-form-item label="确认密码" prop="checkPass">
        <el-input
          type="password"
          v-model="ruleForm.checkPass"
          autocomplete="off"
        ></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="submitForm('ruleForm')"
          >提交</el-button
        >
        <el-button @click="resetForm('ruleForm')">重置</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>
<script>
export default {
  // beforeRouteEnter () {
  //   /* 在局部守卫中获取不到this */
  //   console.log(1);
  // },
  data() {
    var checkUsername = (rule, value, callback) => {
      if (!value) {
        return callback(new Error("用户名不能为空"));
      }else{
        callback();
      }
    };
    var validatePass = (rule, value, callback) => {
      if (value === "") {
        callback(new Error("请输入密码"));
      } else {
        if (this.ruleForm.checkPass !== "") {
          this.$refs.ruleForm.validateField("checkPass");
        }
        callback();
      }
    };
    var validatePass2 = (rule, value, callback) => {
      if (value === "") {
        callback(new Error("请再次输入密码"));
      } else if (value !== this.ruleForm.pass) {
        callback(new Error("两次输入密码不一致!"));
      } else {
        callback();
      }
    };
    return {
      ruleForm: {
        pass: "",
        checkPass: "",
        username: "",
      },
      rules: {
        pass: [{ validator: validatePass, trigger: "blur" }],
        checkPass: [{ validator: validatePass2, trigger: "blur" }],
        username: [{ validator: checkUsername, trigger: "blur" }],
      },
    };
  },
  methods: {
    submitForm(formName) {
      this.$refs[formName].validate((valid) => {
        if (valid) {
          // alert("submit!");
          // console.log(this.ruleForm);
          // console.log(username,pass);
          /* 发送http请求 */
          this.loginHttp()
        } else {
          console.log("error submit!!");
          return false;
        }
      });
    },
    resetForm(formName) {
      this.$refs[formName].resetFields();
    },
    loginHttp(){
      var {username , pass} = this.ruleForm
      this.$http({
        method: 'post',
        url:'http://localhost:8000/login',
        data:{
          username,
          pass
        }
      }).then(res=>{
        console.log(res.data);
        if(res.data.code == 200){
          this.$message({
            message:res.data.msg,
            type:"success",
            duration:1000
          })
          this.$router.push('/home')
        }else{
          this.$message({
            message:res.data.msg,
            type:"warning",
            duration:1000
          })
        }
      })
    }
  }
 
};
</script>

二、后台代码

const koa = require("koa");
const app =  new koa();
const koaBody = require("koa-body");
const router = require("koa-router")();
const cors = require("koa2-cors");
 
    /* username=cheng  pass=123456 */
    console.log(ctx.request.body);
    var {username , pass } = ctx.request.body
    if(username == "cheng" && pass == "123456"){
      ctx.cookies.set("loginAuth",true,{
        /* httpOnly:false   设置前端可读 */
        httpOnly:false
      })
      ctx.body = {
        code:200,
        msg:"登录成功"
      }
    }else{
      ctx.body = {
        code:400,
        msg:"登录失败,用户名或密码错误"
      }
    }
})
/* 后端配置cookie可以实现跨域访问 */
app.use(cors({
  origin:ctx =>{
    return ctx.headers.origin
  },
  credentials:true
}));
app.use(koaBody());
app.use(router.routes());
app.listen(8000);

三、配置cookie跨域访问

3-1 配置后端cookie可以访问

/* 后端配置cookie可以实现跨域访问 */
app.use(cors({
  origin:ctx =>{
    return ctx.headers.origin
  },
  credentials:true
}));

3-2 配置前端跨域访问cookie

import axios from 'axios'
/* 设置前端跨域访问cookie */
axios.defaults.withCredentials = true
axios.defaults.crossDomain = true

3-3 vue上获取cookie

安装依赖

yarn add vue-cookie

配置main.js

import VueCookie from 'vue-cookie'
Vue.use(VueCookie)

在页面中获取cookie

mounted() {
    console.log(this.$cookie.get('loginAuth'));
}

3-4 路由守卫

​ --没有登录的情况下,不能进入其它页面

​ --已经登录的情况下,直接进入首页

var vm = new Vue();
router.beforeEach((to,from,next)=>{
  console.log(vm.$cookie.get('loginAuth'));
  var isLogin = vm.$cookie.get('loginAuth')
  if(to.path == "/login"){
    /* 1、登录页面,如果cookie显示登录了直接进入home页面,如果没有登录,正产执行login页的逻辑 */
    if(isLogin){
      router.push('/home')
    }else{
      next()
    }
  }else{
    /* 2、在其他页面,如果登录正常显示,没有登录则停留在login页面 */
    if(isLogin){
      next()
    }else{
      router.push('/login')
    }
  }
})

懒加载

1、图片懒加载

安装依赖

yarn add vue-lazyload

在main.js中进行配置

import VueLazyLoad from 'vue-lazyload'
Vue.use(VueLazyLoad,{
  preLoad:1.3,
  loading:require('@/assets/loading.gif')
})

使用(将:src替换成v-lazy)

<template>
  <div class="home">
    <div  v-for="item of playlists" :key="item.id">
      <img  class="item" v-lazy="item.coverImgUrl" alt="">
      <p>{{item.name}}</p>
    </div>
  </div>
</template>

2、axios拦截器

​ --实现loading的加载效果

在vuex中定义一条isShowLoading     -->    设置加载条是否显示

export default new Vuex.Store({
  state: {
    isSowLoading:true
  },
})

main.js

// 配置 请求拦截 和 响应拦截
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  store.state.isSowLoading = true
  return config;
});
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
  // 2xx 范围内的状态码都会触发该函数。
  // 对响应数据做点什么
  store.state.isSowLoading = false
  return response;
});

App.vue设置loading

<template>
  <div id="app">
    <Loading v-if="this.$store.state.isShowLoading"/>
    <router-view/>
  </div>
</template>

3、上拉刷新

vant-ui 中整合了小程序中的 onBottom 和 onLoad

<template>
  <div class="home">
    <van-list
      class="home"
      v-model="loading"
      :finished="finished"
      finished-text="没有更多了"
      @load="onLoad"
    >
      <van-cell @click="handleClick(item.id)" v-for="item of playlists" :key="item.id">
        <img class="item" v-lazy="item.coverImgUrl" alt="">
        <p>{{item.name}}</p>
      </van-cell>
    </van-list>
  </div>
</template>
<script>
export default {
  name: 'Home',
  data() {
    return {
      playlists:[],
      loading:false,
      finished:false
    }
  },
  mounted() {
    
  },
  methods: {
    onLoad(){
      setTimeout(()=>{
        var offset = this.playlists.length
        console.log(1);
        this.axios.get(`http://47.108.197.28:3000/top/playlist?offset=${offset}&limit=20`).then(res =>{
          var playlists = this.playlists.concat(res.data.playlists)
          this.playlists = playlists
          this.loading = false
        })
      },500)
    },
    handleClick(id){
      this.$router.push(`detail?id=${id}`)
    }
  },
}
</script>
<style scoped>
  .item{
    width: 150px;
    height: 150px;
  }
  .home{
    display: flex;
    justify-content: space-between;
    flex-wrap: wrap;
  }
  .van-cell{
    width: 150px;
  }
  .home >>> .van-list__loading{
    position: fixed;
    bottom: 0;
    left: 50%;
    transform:translateX(-50%);
  }
</style>

4、路由滚动记录当前滚动条位置问题​

在路由设置中,重置滚动条的x,y

const router = new VueRouter({
  ...
  scrollBehavior (to , from , savedPosition) {
    if( to.path == "/detail"){
      return {x:0,y:0}    // 让页面出于顶部
    }else{
      return savedPosition    // 让页面出于记录点
    }
  }
})

Vue路由跳转的bug

项目中遇到如下报错内容:

Uncaught (in promise) Error: Redirected when going from “/XXX” to “/XXX” via a navigation guard.

原因:vue-路由版本更新产生的问题,导致路由跳转失败抛出该错误,但并不影响程序功能

在main.js中改变push原型

import Router from 'vue-router'
const originalPush = Router.prototype.push
Router.prototype.push = function push(location, onResolve, onReject) {
  if (onResolve || onReject) return originalPush.call(this, location, onResolve, onReject)
  return originalPush.call(this, location).catch(err => err)
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 使用vue-router切换组件时使组件不销毁问题

    目录 vue-router切换组件时使组件不销毁 1.用keep-alive包裹router-view 2.定义路由meta字段 3.keep-alive的原理 vue-router路由切换 组件重用挖下的坑 问题描述 翻车现场再现 车祸原因分析 前往救援 一次真的救援 vue-router切换组件时使组件不销毁 默认地,使用vue-router切换组件时,离开的组件会被销毁,新进入地组件会创建. 那么,有时候,我们希望离开的组件不要被销毁.这时就需要使用到keep-alive标签来缓存组件.

  • Vue Router嵌套路由(children)的用法小结

    目录 简介 使用场景 官网网址 示例 路由配置 用户页面(父页面) 子路由的path前加“/” 简介 说明 本文介绍Vue Router的嵌套路由的用法. 嵌套路由就是父路由里面嵌套他的子路由,父路由有自己的路由导航和路由容器(router-link.router-view),通过配置children可实现多层嵌套.(router-view必须要有,否则点击了router-link后,路径会变化,但页面不改变). 使用场景 嵌套路由用于实现页中页效果.例如: 用户页面中,有登录页面和注册页面,这

  • Vue Router深扒实现原理

    目录 回顾Vue Router的核心代码 代码实现 创建Vue-Router插件 构造函数 完整代码 Vue Router官网 前置知识:插件.slot插槽.mixins混入.render函数.运行时和完整版的Vue 回顾Vue Router的核心代码 // 注册插件 // Vue.use() 内部调用传入对象的 install 方法 Vue.use(VueRouter) // 创建路由对象 const router = new VueRouter({ routes: [ { name: 'ho

  • Vue Router应用方法详解

    目录 服务端路由 路由的应用场景 路由 监听浏览器 hashchange 事件实现路由 使用Vue Router+Vue2实现路由 服务端路由 服务端路由时指的是服务器根据用户访问的 URL 路径返回不同的响应结果. 在传统的服务端渲染的 web 应用中点击一个链接时,浏览器会从服务端获得全新的 HTML页面,然后重新加载整个页面. 然而,在单页面应用中,客户端的 JavaScript 可以拦截页面的跳转请求,动态获取新的数据,无需重新加载的情况下更新当前页面. 这样通常可以带来更顺滑的用户体验

  • Vue cli及Vue router实例详解

    目录 前言: 1. 安装 1.1 npm安装 1.2 vue-cli安装 2. 初始化项目 2.1vue init命令讲解 2.2 项目初始化 3. 运行项目 4. 成功页面 5. 项目结构 5.1 总体框架 5.2 配置目录文件详解 5.3src项目核心文件讲解 6. VUE-ROUTER 6.1 快速入门 6.2 页面跳转 6.3子路由-路由嵌套 6.4路由传递参数 6.5命名路由-命名视图-重定向-别名 前言: 官方文档 vue-cli是vue官方出品的快速构建单页应用的脚手架,里面集成了

  • Vue Router解决多路由复用同一组件页面不刷新问题(场景分析)

    目录 简介 问题复现 代码 测试 解决方案 方案1:导航守卫 方案2:watch监听$route 方案3:父组件router-view指定key 其他网址 简介 说明 本文介绍如何解决Vue的多路由复用同一组件页面不刷新问题. 多路由复用同一组件的场景 多路由使用同一组件 比如:添加博客(path为:/addBlog)和编辑博客(path为:/editBlog)都对应同一个组件(EditBlog.vue) 动态路由 比如:用户详情页采用动态路由,其path为:/user/:id,组件都是User

  • vue-router中关于children的使用方法

    目录 关于children的使用 children的使用场景 router配置中children配置不起作用 关于children的使用 children的使用场景 比如页面左侧显示菜单,右侧显示不同菜单下的内容,类似如下element网站,那么右侧部分的内容就是当前页面的children 存在如下场景,点击导航一跳转至页面1,导航二跳转页面2,且页面1中存在子页面 路由js如下: const routes = [{ path: '/', name: 'Home', component: Hom

  • 关于VueRouter导入的全过程

    目录 router nanoid的使用 引入 使用 路由 1-1 安装依赖 1-2 引入 1-3 在main.js中使用 1-4 App.vue 全局过滤器 element-ui 全局组件 Vuc-cli中的视配 1-1 安装依赖 1-2 配置文件 1-3 main.js 1-4 public/index.html 1-5 在pc端视配 slot封装动画 项目初始化 1-1 .router-link-active 1-2 动态显示tabbar 1-3 跳转回前一个页面 1-4轮播 vant ui

  • vue-router路由简单案例介绍

    官方文档: 旧版:https://github.com/vuejs/vue-router/tree/1.0/docs/zh-cn 新版:http://router.vuejs.org/(2.0版本) 此文是旧版 文件结构图: 基本用法: <router-view>是一个顶级的路由外链,用于渲染匹配的组件. 例如:我的应用入口是app.vue 那么在app.vue中添加如下代码, 此处涉及ES6. app.vue <template> <div class='page inde

  • vue-router 起步步骤详解

    1.在main.js中导入vue-router和组件 import VueRouter from 'vue-router'; // 导入vue-router并将它命名为VueRouter import goods from './components/goods/goods'; // 引入组件 import seller from './components/seller/seller'; 2.为组件设置URL,通过url可以动态的加载组件 const urls = [ { path: '/go

  • Vue-router路由该如何使用

    一.说明 Vue Router是Vue.js官方的路由管理器.它和Vue.js的核心深度集成, 让构建单页面应用变得易如反掌.包含的功能有: 嵌套的路由/视图表 模块化的.基于组件的路由配置 路由参数.查询.通配符 基于Vue js过渡系统的视图过渡效果 细粒度的导航控制 带有自动激活的CSS class的链接 HTML5 历史模式或hash模式, 在IE 9中自动降级 自定义的滚动行为 二.安装 基于第一个vue-cli进行测试学习: 先查看node modules中是否存在vue-route

  • 详解vue路由篇(动态路由、路由嵌套)

    什么是路由?网络原理中,路由指的是根据上一接口的数据包中的IP地址,查询路由表转发到另一个接口,它决定的是一个端到端的网络路径. web中,路由的概念也是类似,根据URL来将请求分配到指定的一个'端'.(即根据网址找到能处理这个URL的程序或模块) 使用vue.js构建项目,vue.js本身就可以通过组合组件来组成应用程序:当引入vue-router后,我们需要处理的是将组件(components)映射到路由(routes),然后在需要的地方进行使用渲染. 一.基础路由 1.创建vue项目,执行

  • Vue项目中使用mock.js的完整步骤

    在Vue项目中使用mock.js 开发工具选择:Vscode 1. 使用命令行创建vue项目(手动选择Babel,Router,Vuex) 2. 导入element-ui(为了显示效果好一点),命令行输入 npm i element-ui -S 3.在main.js中进行引用 import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css';//样式文件一定要引入 Vue.use(ElementUI)

  • Vue实现路由嵌套的方法实例

    1.嵌套路由又称子路由,在实际应用中,通常由多层嵌套的组件组合而成.(其实就是套娃操作罢了,跟后端的视图跳转路径蛮像的): 2. 创建用户信息组件,在 views/user 目录下创建一个名为 Profile.vue 的视图组件: Profile.vue <template> <h1>咸鱼_翻身1</h1> </template> <script> export default { name: "UserList" } <

  • Intellij Idea中批量导入第三方jar包的全过程

    目录 添加和导入的区别 具体步骤 1. 创建lib文件夹 2. 添加为Library 3. 添加Dependence 4. 检查是否引用成功 5. 继续添加jar包 总结 jar包就指第三方提供的开源的API,这些API不属于JDK的,需要通过导入才能使用. 添加和导入的区别 注意:本文里的 导入 和 添加 jar包是不同的含义. 导入:在代码中引用jar包. 添加:只是简单把jar包拷贝到项目中而没有引用,这时会报错. 所以我们的目标是导入,也就是能让我们的编译器找到jar包中的类. 具体步骤

  • windows下vue-cli导入bootstrap样式

    1.先安装好vue-cli,如果还没有安装好的可以参考:<windows下vue-cli及webpack 构建网站(一)环境安装> 2.安装好之后Vue的欢迎界面,我们要做个例子导入bootstrap的样式,就先去复制一份bootstrap的导航样式过来替换掉Vue的欢迎页面吧,打开Src文件夹下面的components组件目录,然后打开 Hello.vue文件,把 <h1>{{ msg }}</h1> <h2>Essential Links</h2&

  • Vue学习笔记进阶篇之vue-router安装及使用方法

    介绍 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用.vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来.传统的页面应用,是用一些超链接来实现页面切换和跳转的.在vue-router单页面应用中,则是路径之间的切换,也就是组件的切换. 本文是基于上一篇文章(Vue学习笔记进阶篇--vue-cli安装及介绍)vue-cli脚手架工具的. 安装 在终端通过cd命令进入到上一篇文章中创建的my-demo1项目目录里

随机推荐