Vue学习笔记记录

MVC 模式

M model 模型 数据(js变量)
V view 视图 用户所见界面(html css)
C control 控制器 事件的交互后改变视图和数据 关联(对DOM绑定事件)

MVVM模式

VM 即是替代C的,比如框架,可以直接实现数据交互

虚拟DOM

在js的内存中构建类似于DOM的对象,去拼装数据,拼装完整后,把数据整体解析,一次性插入html中,形成了虚拟DOM,相当于之前一条条向HTML中传数据,现在打包好一次性传入,效率提高。

创建项目

命令行vue ui

第一次是可能cli版本较低,需要先卸载之前的版本,使用npm uninstall vue-cli -g 或 yarn global remove vue-cli 命令行
之后再安装

npm install -g @vue/cli

安装成功后运行vue ui即可打开可视化界面进行创建(运行vue ui 最好在你所要创建的目录下运行)

之后界面日志显示这样一个报错
Failed to get response from https://registry.npm.taobao.org/vue-cli-version-marker
强制清除npm 缓存后报错消失

npm cache clean --force

配置elemen ui

插件添加插件搜索:vue-cli-plugin-element
找到后安装

安装axios依赖

依赖 添加依赖 搜索axios

码云代码托管

设置SSH公钥

具体流程见链接

设置路由

按需导入element

  1. 在element.js 里导入
import {} from 'element-ui'

{}里代表要导入的组件
比如:

import {Form,FormItem} from 'element-ui'
import {Input} from 'element-ui'
  1. 然后注册全局可用
Vue.use(Form)
Vue.use(FormItem)
Vue.use(Input)

导入外部图标

  1. 在阿里矢量库选择图标下载代码至本地
  2. 将fonts文件导入到项目文件夹assets中
  3. 在main.js中全局引入
import './assets/fonts/iconfont.css'
  1. 在需要的地方写入基础类名和对应的图标名
 <el-input  prefix-icon="iconfont icon-electronics
"  placeholder="请输入密码"></el-input>

导入axios包

  1. 在main.js全局导入,挂载到vue的原型对象上
import axios from 'axios'
Vue.prototype.$http=axios
  1. 这样每一个vue的组件都可以通过this访问到$http,从而发起axios请求
    再为axios设置请求的根路径
axios.defaults.baseURL="http://???/api/private/v1/"
  1. 使用示例:
 this.$http.post("login",this.loginForm).then(res=>{
           console.log(res)
         });

第一次显示报错post未定义,后来发现是没有保存main.js文件哈哈哈

编程式跳转页面

利用路由

 this.$router.push('/home')

需要在路由里注册

import Home from '../components/Home.vue'
在routes数组中加入该对象
 {
    path:'/home',
    component:Home
  }

个人想法,微信小程序的wx.navigator也是类似的功能,会跳转到指定页面文件的xml,而这个是跳转到指定的组件

路由导航守卫控制页面访问权限

代码示例:

router.beforeEach((to, from, next)=>{
  //to表示将要访问的路径
  //from 表示从哪个路径跳转过来
  //next是一个函数,表示放行,两种表示方式 next() 直接放行   next('/login') 强制跳转
  if(to.path === '/login') return next()
  const tokenstr = window.sessionStorage.getItem('token')
  if(!tokenstr) return next('/login')
  next()
})

axios拦截器

axios.interceptors.request.use(config=>{
  console.log(config)
  config.headers.Authorization = window.sessionStorage.getItem('token')
  return config//必填
})

子路由

使用children数组,并将/home重定向,并在Home组件中放一个路由占位符:

 {
    path:'/home',
    component:Home,
    redirect:'/welcome',
    children:[
      {
        path:'/welcome',
        component:Welcome
      }
    ]
  }
 <el-main>
         <router-view></router-view>
  </el-main>

公共组件封装

以面包屑导航为例:

  1. 新建BreadNav.Vue 文件
    这里提示必须有v-bind:key
<template>
  <el-breadcrumb separator="/" separator-class="el-icon-arrow-right">
    <el-breadcrumb-item :to="{ path: '/home' }">首页</el-breadcrumb-item>
    <el-breadcrumb-item v-for="item in navList" :key="item.name">{{item.name}}</el-breadcrumb-item>
  </el-breadcrumb>
</template>

<script>
    export default{
      name:'BreadNav',
      props:{
        navList:{   //接收到来自父组件的传值
          type:Array,
          required:true
        }
      }
    }
</script>

  1. 新建一个js文件(类似于element.js,但也有许多不一样,暂时还不明白)
import BreadNav from './BreadNav.vue';
BreadNav.install=function(Vue){
  Vue.component(BreadNav.name,BreadNav)
}
export default BreadNav
  1. 在main.js中全局引用
import BreadNav from '@/components/common/BreadNav.js'
Vue.use(BreadNav)

4.使用

<template>
  <div>
      <bread-nav :navList="breadNavList"></bread-nav>
  </div>
</template>

<script>
  export default{
    data(){
      return{
        breadNavList:[
          {
            name:'权限管理'
          },

          {
            name:'权限列表'
          }
        ]
      }
    }

  }
</script>

过滤器

全局定义:

Vue.filter("dateFormat", function(originVal) {
  const dt = new Date(originVal);
});

使用:

{{variable | dateFormat}}

个人感觉类似于计算属性的作用,需要对数据进行处理才能得到正确的展示数据

安装echarts插件

1.在vue UI 可视化里安装echarts 依赖
2. 导入到所需的组件中

import * as echarts from "echarts";

import * as xxx from ‘xxx’: 会将若干export导出的内容组合成一个对象返回;

import xxx from ‘xxx’:只会导出这个默认的对象作为一个对象
第一次采用第二种方式导入,报错了
3. 准备一个DOM

 <div id="main" style="width: 600px;height:400px;"></div>
  1. 在DOM 渲染完成后(即使用mounted函数)调用
mounted() {
    // 基于准备好的dom,初始化echarts实例
    var myChart = echarts.init(document.getElementById("main"));
    var option = {
      title: {
        text: "ECharts 入门示例"
      },
      tooltip: {},
      legend: {
        data: ["销量"]
      },
      xAxis: {
        data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
      },
      yAxis: {},
      series: [
        {
          name: "销量",
          type: "bar",
          data: [5, 20, 36, 10, 10, 20]
        }
      ]
    };
    myChart.setOption(option);
  },

nprogress 进度条插件

只需在全局引入,在需要的位置调用函数显示和隐藏进度条

babel-plugin-transform-remove-console 开发依赖

安装之后在babel.config.js中加一行

 "transform-remove-console"

但是这样的在开发阶段和发布阶段的console.log都会被去掉,可以先做一个判断再决定是否加入

const prodPlugins = [];
//如果是产品发布阶段才会去掉console.log
if (process.env.NODE_ENV === "production") {
  prodPlugins.push("transform-remove-console");
}

module.exports = {
  presets: ["@vue/cli-plugin-babel/preset"],
  plugins: [
    [
      "component",
      {
        libraryName: "element-ui",
        styleLibraryName: "theme-chalk"
      }
    ],
    ...prodPlugins
  ]
};

通过chainWebpack 配置开发环境与生产环境两个不同的入口

在根目录下新建一个文件 vue.config.js

module.exports = {
  chainWebpack: config => {
    config.when(process.env.NODE_ENV === "production", config => {
      config
        .entry("app")
        .clear()
        .add("./src/main-prod.js");
    });

    config.when(process.env.NODE_ENV === "development", config => {
      config
        .entry("app")
        .clear()
        .add("./src/main-dev.js");
    });
  }
};

通过externals 加载外部CDN资源

引入外部依赖项,在进行打包的时候,会将所有导入的依赖项都打包到一个文件中,会使文件包特别大,通过externals 配置,在进行打包时,如果在externals 里包含该依赖,便不会将其打包,而是会到window全局环境中去查找该依赖,从而减小包的大小

只在发布模式里引入

 config.set("externals", {
        vue: "Vue",
        "vue-router": "VueRouter",
        axios: "axios",
        lodash: "_",
        echarts: "echarts",
        nProgress: "Nprogress"
      });

之后还要在index.html文件头部添加对应的CDN资源引用,包括js与css样式
如:

<script src="https://cdn......></script>

我的理解就是这样通过外部引用调用就不需要引入到自己的文件中,从而减少自己文件的大小,减轻服务器压力

对element ui 外部引用CDN资源

在main-prod.js中删除掉对element ui 的import
在index.html 文件中引入对应的cdn 资源 (包括js和css)
不是很理解为什么element ui 的改进和其他依赖不同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值