记录一个完整的vue cli项目 从搭建到上线

环境就不说了 安装node 安装cli之类。。。
一,初始化项目

vue init webpack projectName

之后就是相关配置 严格模式最好不要选

在这里插入图片描述
执行此命令,即可启动自己的项目,关于主机端口配置在config目录下的index.js文件中

ps:以上比较简单 可以在菜鸟教程上观看详细的步骤

二,安装及引入项目所需依赖(做此记录时我仅安装Axios,Element,Less)

npm i vue-axios  -S
npm i element-ui -S
npm install less less-loader --save-dev
//i为install简写  -S为--save-dev简写
//据说使用简写会有一定差别,但暂未发现

安装完成之后,在配置文件packjosn.js中会看到相关版本信息

"dependencies": {
    "axios": "^0.19.0",
    "element-ui": "^2.10.1",
    "vue": "^2.5.2",
    "vue-axios": "^2.1.4",
    "vue-echarts": "^4.0.3",
    "vue-router": "^3.0.1"
  },

ps:其中dependencies为生产环境所需依赖,devDependencies为开发环境所需依赖具体区别在此不做赘述

安装完成之后在main.js中引入即可,上代码

import Vue from 'vue'
import router from './router'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import axios from 'axios'
import VueAxios from 'vue-axios'
import App from './App'
Vue.config.productionTip = false
Vue.use(ElementUI)
Vue.use(VueAxios,axios);

使用此方法(VueAxios )使用axios时还需安装VueAxios 否则报错,
或者将axios加入vue原型亦可,代码如下:

import axios from 'axios'
Vue.prototype.$ajax= axios

axios具体用法见官方文档axios使用说明
看到一篇封装axios的详细教程

https://blog.csdn.net/qq_38145702/article/details/81558816

使用Less等预编译语言不用引入 具体见我另一篇博客VUE2.0 vue-cli构建项目中使用Less/Scss

项目起步完成
在这里插入图片描述

  <el-button type="primary">主要按钮</el-button>
  //element使用正常
  <style scoped lang="less">
  @color:red;
  //Less使用正常
  getData(){
      this.axios.post('http://jsonplaceholder.typicode.com/posts'
      ).then(function (response) {
          console.log(response);
        })
        .catch(function (error) {
          console.log(error);
        });
    }
   axios使用正常 [安利一个比较好用的在线接口网站jsonplaceholder]

接下来开始写项目咯

三,开始踩坑
将HelloWord.vue作为空模板把默认内容删除

<template>
		//这里是页面--html  此处有且只有一个直接子div
</template>

<script>
//这里是脚本--js
export default {
  name: 'Login',
  data () {
    return {

    };
  },
  methods:{

  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped lang="less">
//这里是样式--css
</style>

然后去router/index.js文件中配置路由,在开发中只有发生页面跳转就在此写路由

import Vue from 'vue'
import Router from 'vue-router'
import Login from '@/components/Login'  //引入模板

Vue.use(Router)  //使用路由

export default new Router({
  routes: [
  //配置路由
    {
      path: '/',
      name: 'Login',
      component: Login
    }
  ]
})

ps:关于vue的路由使用可参考我转载的一篇文章,记录了路由传参的过程
https://segmentfault.com/a/1190000018711422
写到这应该可以结束了 具体踩的坑还是在别的文章中体现吧 不然太乱了
最后说一下打包上线,就是把vue项目打包成普通项目放入tomcat等服务器中

npm  run build

执行此命令后会将项目打包成dist文件夹,里面有index.html和一些资源文件,

!!关键是没人看啊 有人看的话给个赞 啊 我继续更新

父组件改变子组件的值

想要把遮罩层抽出来写成子组件,在父组件里改变点击按钮让遮罩显示,
用父子传值好像只能传一次 在这里还是用ref操作dom吧

父组件里绑定ref

 <ReleaseRes ref="ReleaseRes"></ReleaseRes>
 //然后在方法里改变值
  //发布资源
      releaseRes() {//点击这个按钮出现遮罩层
        this.$refs.ReleaseRes.releaseResVisible = true;
      },

然后是在子组件里使用父组件定义的方法

openDetail() {
        this.$parent.addTab();//这里是父组件里的方法
      },

有时候会需要在页面监听路由变化进行数据更新

watch: {
      /**
       * 利用路由反向监听tab变更
       * @param to
       */
      '$route'(to) {
        console.log(to);
        this.getResource();
        this.getComment();
      }
    },

使用vue-router实现拦截登录(全局守卫)

当然也可以使用axios的响应拦截器对后台返回的“登录状态”进行判断
首先是在路由的index页对将要跳转的页面做如下配置

 //需要登录才能进入的页面可以增加一个meta属性
          meta: {
            requireAuth: true}
        },

然后在main.js页面写相关逻辑

/*
* 全局守卫
* */
router.beforeEach((to, from, next)=>{
  console.log('-------------to--------');
  console.log(to);
  console.log('---------------------');
  console.log(sessionStorage);
  if (to.fullPath=="/"){//如果是去登录页就让他去
    next()
  } else {//如果不是去登录页我们就检查他的session
    try{
      if (sessionStorage.getItem("username")){//如果session里面有登录信息,就让他过去
        next()
      }else {
        next({path:"/"})//如果没有就去登录页登录
      }
    }catch (e) {
      next({path:"/"})//不行就去登录页
    }
  }

})

router.beforeEach的理解: 定义: 全局守卫 ,不管访问那个路由都先走这里

每个守卫方法接收三个参数:

to: Route: 即将要进入的目标 路由对象

from: Route: 当前导航正要离开的路由

next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。

next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。

next(false): 中断当前的导航。如果浏览器的 URL 改变了 (可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。

next(’/’) 或者 next({ path: ‘/’ }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。你可以向 next 传递任意位置对象,且允许设置诸如 replace: true、name: ‘home’ 之类的选项以及任何用在 router-link 的 to prop 或 router.push 中的选项。

next(error): (2.4.0+) 如果传入 next 的参数是一个 Error 实例,则导航会被终止且该错误会被传递给 router.onError() 注册过的回调。

确保要调用 next 方法,否则钩子就不会被 resolved。

关于打包的配置

一,路径配置
在config-index下
将路径"/"改为"./"
二,在router-index下
history改成hash
三,build-utils下
加上路径配置
另外:关于打包之后的样式与开发环境不一致的问题,可参见我的另一篇总结
https://blog.csdn.net/qq_44472722/article/details/95217445

修改滚动条样式,

好久没更了,今天写到一个要,于是百度了一下,代码如下

//修改滚动条样式
  ::-webkit-scrollbar {
    width: .5rem;
    height: .5rem;
    background: hsla(0, 0%, 100%, 0.6);
  }

  ::-webkit-scrollbar-track {
    border-radius: 0;
  }

  ::-webkit-scrollbar-thumb {
    border-radius: 0;
    background-color: rgba(95,95,95,.4);
    transition: all .2s;
    border-radius: .5rem;

    &:hover {
      background-color: rgba(95,95,95, .7);
    }
  }

然后写道一个前端的搜索功能,用es6的filter和match即可实现
首先写一个计算属性

computed:{
      searchBaseName:function () {
      return  this.checkBaseList.filter(item=>{
          return item.match(this.baseNameKey)
        })
      }
    },

然后去遍历这个返回的数据而不是list本身了

<el-checkbox v-for="(item,index) in searchBaseName"
                               :key="index"
                               :label="item">
                    
                  </el-checkbox>

深度监听

 watch:{
            // releaseResFromStr.serverClass.dataBaseType
            /* 监听数据库类型-改变对应端口号
            * 深度监听
            * */
            "releaseResFromStr.serverClass.dataBaseType":{
                handler(newName) {
                    if(newName==1){
                        this.releaseResFromStr.serverClass.ip[4] = "3306"
                    }else if (newName==2){
                        this.releaseResFromStr.serverClass.ip[4] = "1521"
                    } else if (newName==3){
                        this.releaseResFromStr.serverClass.ip[4] = "5236"
                    } else {
                        this.releaseResFromStr.serverClass.ip[4] = "54321"
                    }
                },
                deep: true,
            }
        },

文件下载方法

引用

https://blog.csdn.net/nihaoa50/article/details/84346880
exportData () {
        const form = this.getSearchForm() // 要发送到后台的数据
        axios({ // 用axios发送post请求
          method: 'post',
          url: '/user/12345', // 请求地址
          data: form, // 参数
          responseType: 'blob' // 表明返回服务器返回的数据类型
        })
          .then((res) => { // 处理返回的文件流
            const content = res
            const blob = new Blob([content])
            const fileName = '测试表格123.xls'
            if ('download' in document.createElement('a')) { // 非IE下载
              const elink = document.createElement('a')
              elink.download = fileName
              elink.style.display = 'none'
              elink.href = URL.createObjectURL(blob)
              document.body.appendChild(elink)
              elink.click()
              URL.revokeObjectURL(elink.href) // 释放URL 对象
              document.body.removeChild(elink)
            } else { // IE10+下载
              navigator.msSaveBlob(blob, fileName)
            }
        })
      }

类的绑定

<i :class="['el-icon-refresh',clickIcon?'donghua':'']" @click="refreshBase()"></i>
:class="[item.icon,{navCheck:categoryIndex==index}]"

样式的绑定格式

<el-form-item :style="{'position': 'absolute','top': 0,'left': takePrepare.validityType===1?200+'px':0}">

element dialog 居中

.el-dialog{
       display: flex;
       flex-direction: column;
       margin:0 !important;
       position:absolute;
       top:50%;
       left:50%;
       transform:translate(-50%,-50%);
       /*height:600px;*/
       max-height:calc(100% - 30px);
       max-width:calc(100% - 30px);
   }
   .el-dialog .el-dialog__body{
       flex:1;
       overflow: auto;
   }

vue计算属性传参

computed: {
          text() {
              return function (index) {
                  return this.Ratedata[index].currentRate.toFixed(0) + '%';
              }
          }
        },

element表格嵌套表格的写法

https://blog.csdn.net/Mr_EvanChen/article/details/83350134?utm_source=app
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值