前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >vue 知识总结

vue 知识总结

原创
作者头像
Krry
修改2019-04-09 13:24:29
1.2K0
修改2019-04-09 13:24:29
举报
文章被收录于专栏:KrryblogKrryblog

博客地址:https://ainyi.com/4

版本:vue 2.x

Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。

Vue 核心思想&全家桶

组件化和数据驱动,组件化就是将一个整体合理拆分为一个一个小块(组件),组件可重复使用,数据驱动是前端的未来发展方向,释放了对DOM的操作,让DOM随着数据的变化自然而然的变化,不必过多的关注DOM,只需要将数据组织好即可。

  • vue-cli
  • vue-router
  • vuex
  • axios

vue 生命周期

  1. beforeCreate
  2. created
  3. beforeMount
  4. mounted
  5. beforeUpdate:(数据更新时调用)
  6. updated:(数据更新后调用)
  7. activated:(keep-alive 组件激活时调用)
  8. deactivated:(keep-alive 组件停用时调用)
  9. beforeDestroy
  10. destroyed

vue-cli

  • 是快速构建单页应用的脚手架
  • vue-cli 大大降低了webpack 的使用难度,支持热更新,有webpack-dev-server的支持,相当于启动了一个请求服务器,给你搭建了一个测试环境,只关注开发
  • 热更新:是检测文件的变化并用websocket通知客户端做出相应的更新(webpack里配置)
代码语言:txt
复制
//安装vue-cli
npm install -g vue-cli

//利用脚手架初始化项目
vue init webpack vue_project

vue-router

  • vue-router 是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用。vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。
  • 传统的页面应用,是用一些超链接来实现页面切换和跳转的。在vue-router单页面应用中,则是应该是路径之间的切换,也就是组件的切换

路由和页面(组件)对应

==重点==:如果需要有些页面组件是挂载在某个组件之下,可以使用 children

代码语言:txt
复制
const Layouts = () => import('@/views/Layouts')
const Detail = () => import('@/views/orderManagement/Detail')
const List = () => import('@/views/orderManagement/List')
const OrderRouter = [
  {
    path: '/cost',
    redirect: '/cost/order-list',
    component: Layouts,
    children: [
      {
        path: 'order-list',
        component: List
      },
      {
        path: 'order-detail',
        component: Detail
      }
    ]
  }
]
export default OrderRouter


// 这样写,组件 List 和组件 Detail 都是挂载在组件 Layouts 之下
// 前提是 Layouts 组件要写上 <router-view></router-view> 才可以挂载子组件

router 跳转以及参数

代码语言:txt
复制
<router-link 
    :to="{
        path: 'yourPath', 
        params: { 
            id: id, 
            dataObj: data
        },
        query: {
            id: id, 
            dataObj: data
        }
    }">
</router-link>
  • 这里涉及到三个参数
代码语言:txt
复制
path -> 是要跳转的路由路径,也可以是路由文件里面配置的 name 值,命名路由,两者都可以进行路由导航
params -> 是要传送的参数,参数可以直接key:value形式传递(类似post)
query -> 是通过 url 来传递参数的同样是key:value形式传递(类似get)
接收参数:
this.$route.query.id
this.$route.params.id
路由的配置
{
  path:'/admin/:username', // :冒号后面是参数
  component:() => import('../components/Admin.vue'),
  name:"admin",
  meta:{title:'个人中心'},
},

关于path路径加不加 / 的问题,加了/就是在根路径下跳转,不加就是在当前路径后面跳转,子页面,使用命名路由就不用管加不加 / 的问题了

  1. this.$router.push() 方法
  2. params 传参

注意:params传参 ,路径不能使用 path,只能使用 name,否则获取不到传的数据

代码语言:txt
复制
this.$router.push({
  name: 'dispatch',
  params: {
    paicheNo: obj.paicheNo
  }
})
  • query 传参 (路径可用 path 或 name)
代码语言:txt
复制
this.$router.push({
  path: '/transport/dispatch',
  query: {
    paicheNo: obj.paicheNo
  }
})
// or
this.$router.push({
  name: 'dispatch',
  query: {
    paicheNo: obj.paicheNo
  }
})
  • 改变路由参数
代码语言:txt
复制
this.$router.push({ query: {paicheNo: obj.paicheNo }})
this.$router.push({ params: {paicheNo: obj.paicheNo }})
  1. 复用组件时,想对路由参数的变化作出响应的话,可以 watch(监测变化) $route 对象
代码语言:txt
复制
watch:{
    //监听相同路由下参数变化的时候,从而实现异步刷新
    '$route'(to,from){
        //做一些路由变化的响应
        this.loading = true;//打开加载动画
        this.getCateShop();//重新获取数据
    },
},
  1. 全局钩子,在main.js配置,可用作用户拦截
代码语言:txt
复制
//在进入路由之前, 每一次都会执行此方法  全局钩子
router.beforeEach(function(to,from,next){
  //设置网页标题
  document.title = to.meta.title;
  //检查是否已登录
  let userObj = JSON.parse(sessionStorage.getItem('user'));
  if(userObj){
    //执行方法,将用户名设置进全局参数  vuex
    //提交mutation的Types.SETUSERNAME方法
    //第二个参数是携带的参数
    //main.js使用vuex的提交方法,不需要this.$store.commit(),直接就store.commit()
    store.commit(Types.SETUSERNAME,userObj.username);
  }else{
    //如果未登录,想要进入admin目录,则自动跳回首页
    if(to.path.indexOf('admin') != -1){
    //   alert("进了");
      router.push({name:'home'});
    }
  }
  next(); //继续往下走
});

懒加载

也叫延迟加载,即在需要的时候进行加载,随用随载,打开当前页面只加载当前页面的 js

  • 为什么需要懒加载?像vue这种单页面应用,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要加载的内容过多,时间过长,会出啊先长时间的白屏,即使做了loading也是不利于用户体验,而运用懒加载则可以将页面进行划分,需要的时候加载页面,可以有效的分担首页所承担的加载压力,减少首页加载用时

简单的说就是:进入首页不用一次加载过多资源造成用时过长

实现方式,就是我一直以来的做法:

路由配置中,按需导入,配置每一个路由,就 import 需要的组件

  1. 路由懒加载
代码语言:txt
复制
import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

export default new Router({
  mode:'history',
  routes: [
  	{
      path:'/',
      redirect:'/home'
    },
    {
      path:'/login',
      component: () => import('../components/Login.vue'),
      meta:{title:'登录'}
    },
    {
      path:'/register',
      component: () => import('../components/Register.vue'),
      meta:{title:'注册'}
    },
  	{
      path:'/home',
      component: () => import('../components/Home.vue'),
      name:"home",
      meta:{title:'首页'}
    },
  ]
})
  1. 组件懒加载
代码语言:txt
复制
export default {
  components: {
    SectionHeader: () => import('@/components/SectionHeader'),
    SectionArticle: () => import('@/components/SectionArticle'),
    NoResult: () => import('./NoResult'),
  }
}

组件全局注册

代码语言:txt
复制
文件:components/index.js
// 全局注册的组件
import MyHeader from './Header';
import MyFooter from './Footer';
import NotFound from './NotFound';

export default {
  MyHeader,
  MyFooter,
  NotFound,
};


文件:main.js
// 加载全局组件
import components from './components';
// 注册全局组件
Object.keys(components).forEach(key => {
  Vue.component(key, components[key]);
});

路由高级配置

例如:可选的动态路径参数、匹配零个或多个、一个或多个,甚至是自定义正则匹配

代码语言:txt
复制
const router = new VueRouter({
  mode: 'history',
  base: __dirname,
  routes: [
    { path: '/' },
    // params are denoted with a colon ":"
    // 必传参数
    { path: '/params/:foo/:bar' },
    // a param can be made optional by adding "?"
    // 可有可无的参数
    { path: '/optional-params/:foo?' },
    // a param can be followed by a regex pattern in parens
    // this route will only be matched if :id is all numbers
    // 匹配正则
    { path: '/params-with-regex/:id(\\d+)' },
    // asterisk can match anything
    // 匹配后面所有
    { path: '/asterisk/*' },
    // make part of th path optional by wrapping with parens and add "?"
    // 括号内路径可有可无
    { path: '/optional-group/(foo/)?bar' }
  ]
})

vuex

内容过多,点击观看

axios

内容过多,点击观看

vue.use

vue.use() 使用插件(执行的是插件的 install 方法)

  1. 添加全局方法或者属性,如: vue-custom-element
  2. 添加全局资源:指令/过滤器/过渡等,如 vue-touch
  3. 通过全局 mixin 方法添加一些组件选项,如: vue-router
  4. 添加 Vue 实例方法,通过把它们添加到 Vue.prototype 上实现。
  5. 一个库,提供自己的 API,同时提供上面提到的一个或多个功能,如 vue-router
  6. 插件必须要有 install 方法,执行就是 install 方法

页面级 MVC 结构

如图划分原则:纵向:通过业务功能(可根据视图模块判断)划分 横向:通过Model-View-Controller三种不同职能划分

如上,将每个页面划分为 MVC 结构,在介绍前端在哪实现 MC 两层之前,先说一下 MVC 的概念:模型 Model:模型代表着一种企业规范,就是业务流程/状态的处理以及业务规则的规定。业务流程的处理过程对其他层来说是不透明的,模型接受视图的请求,并从接口返回结果。业务模型的设计可以说是MVC的核心

  1. 视图 View:视图即是用户看到并与之交互的界面,比如HTML(静态资源),JSP(动态资源)等等,并且视图层仅做展示界面,不做与接口数据的相关处理逻辑
  2. 控制器 Controller:控制器即是控制请求的处理逻辑,对请求进行处理,负责请求转发
  • 联想起 Java web 经典三层结构:控制层(表现层)、持久层(dao层)、业务层(service层) (MVC 是一种设计模式,java web 三层架构是一种架构思想)
  • 从上面可知,在页面中实现 MVC 模式,对于vue项目中,MC 两层又有两种写法:
  1. 多个组件通用数据的大项目: 写在vuex中,页面 dispatch action,在 action 内部做异步请求调用接口返回数据,随 commit mutation 传递接口数据,并在 mutation 内部对数据做逻辑处理,写入 state,在页面调用 state 或 getters 直接使用

数据流动:view -> vuex(action) -> dao -> vuex(mutation) -> state -> (getters) -> view

  1. 没有太多通用数据的项目: 页面调用接口返回的数据,单独将这一部分数据处理抽出来作为 service,就变成页面调用 service 层,在 service 层做异步请求调用接口返回数据,并对数据做逻辑处理返回到页面直接使用

数据流动:view -> service -> dao -> service -> view

is 操作符

  • 就是有些元素内部不能使用自定义标签或者自定义标签内也不能放某些特殊的标签,这时候就要用 is 代替一下,让 html 语法符合规则验证。is 属于指定要在内部使用的标签 在自定义组件中使用这些受限制的元素时会导致一些问题,例如:
代码语言:txt
复制
<table>
  <my-row>...</my-row>
</table>
  • 自定义组件 <my-row> 会被当作无效的内容,因此会导致错误的渲染结果。变通的方案是使用特殊的 is 特性: is 的值为:已注册组件的名字,或一个组件的选项对象
代码语言:txt
复制
<table>
  <tr is="my-row"></tr>
</table>

这两种写法表达的意思是一样的,但是第一种写法是不符合 html 语法验证的,所以采用第二种写法

博客地址:https://ainyi.com/4

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Vue 核心思想&全家桶
  • vue 生命周期
  • vue-cli
  • vue-router
    • 路由和页面(组件)对应
      • router 跳转以及参数
        • 懒加载
          • 组件全局注册
            • 路由高级配置
            • vuex
            • axios
            • vue.use
            • 页面级 MVC 结构
            • is 操作符
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档