vue+element-ui小结

element-ui上传icon图标

<el-table-column
          prop="permissionIcon"
          label="图标"
          show-overflow-tooltip>
          <template slot-scope="scope">
            <i :class="scope.row.permissionIcon"></i>
          </template>
        </el-table-column>

标题解决vscode不能注释问题

原因:点击vue文件不能直接识别vue文件(右下角一直是纯文字提示,应该是vue)
方案:安装插件: vue, VueHelper 和 vetur 。任选其一
Ctrl + P 然后输入 ext install vetur 然后回车点安装即可。
这时可以打开一个vue文件试试,注意下右下角状态栏是否正确识别为 vue 类型:
在这里插入图片描述

点击哪个让哪个有选中图标

<li v-for="(item,index) in lis" :key="index" @click="onShow(index)">
        <div class="pay_list_left">
            <img class="imgs" :src="item.imgs" alt="">
            <span>{{item.spans}}</span>
        </div>
        <img src="../assets/select.png" alt="" :class="{select:cons==index}">
</li>
data(){
        return{
          cons:0,
          lis:[
            {
              imgs:require('../assets/deal_yunzhifu.png'),
              spans:'云闪付'
            },
            {
              imgs:require('../assets/deal_weixin.png'),
              spans:'微信'
            },
            {
               imgs:require('../assets/deal_zhifubao.png'),
               spans:'支付宝'
            },
            {
               imgs:require('../assets/fukuan_quick.png'),
               spans:'快捷支付'
            },
          ]
        }
    },
    methods:{
        onShow(index){
          this.cons=index
        }
    }
.select{
            display: block;
        }

让银行卡号前几位变成*,只展示后四位

let idCardNumber = cardList.map(item=>{
            item.xing = "**** **** *** " + item.idCardNumber.substr(item.idCardNumber.length-4)
            return item
 })
 console.log(idCardNumber)

基于vue axios上传图片到七牛云

参考链接:https://www.jianshu.com/p/6d21a54fbfbd

将图片路径转base64

 data(){
      return{
        img:'https://img.alicdn.com/bao/uploaded/TB1qimQIpXXXXXbXFXXSutbFXXX.jpg',
      }
    },
getBase64Image(img){
        var canvas = document.createElement("canvas");
        canvas.width = img.width;
        canvas.height = img.height;
        var ctx = canvas.getContext("2d");
        ctx.drawImage(img, 0, 0, img.width, img.height);
        var ext = img.src.substring(img.src.lastIndexOf(".")+1).toLowerCase();
        var dataURL = canvas.toDataURL("image/"+ext);
        return dataURL;
      },
mounted(){
      var image = new Image();
      image.crossOrigin = '';
      image.src = this.img;
      var base64 = this.getBase64Image(image);
    }

基于vue制作中间带logo超清二维码

1.安装插件vue-qr
npm install vue-qr --save
2.插件地址上面有各种属性
https://www.npmjs.com/package/vue-qr
3.以下链接是搜索到封装好了的组件
http://www.mamicode.com/info-detail-2566029.html
4.当当当第四条是我应用到项目中截取的小demo

//logoSrc中间logo地址,text二维码地址链接,size二维码大小单位px,logoMargin中间logo距离边上的margin,
margin二维码的边框,logoScale中间logo的大小取值0.1-1,dotScale数据区域点缩小比例,默认为0.35,
logoBackgroundColor背景色,需要设置 logoMargin
 <div style="width:145px;height: 145px;background: #eee; id="qrcode">
                <vue-qr 
	                :logoSrc="config.imagePath" :text="config.value" 
	                :size="250" :logoMargin="5" :margin="0" :logoScale="0.2" 					                 			
	                :dotScale="1" logoBackgroundColor='#FFFFFF'>
                </vue-qr>
</div>
//引入组件,注册组件,data设置初始值
 import VueQr from 'vue-qr'
 export default {
    components:{
        VueQr
    },
     data(){
	      return{
		      config: {
		          value: 'https://www.npmjs.com/package/vue-qr',//显示的值、跳转的地址
		          imagePath: require('../assets/code_yunshanfu.png')//中间logo的地址
	        }
	      }
      }
}
//先把二维码大小设置大出容器,之后再缩放,这样做是让二维码不失真更清晰
#qrcode{
        img{
            transform:scale(0.58);
            transform-origin:0 0;
        }
    }

h5加百度统计

此处为本文参考链接点击查看
1.在main.js下百度统计代码添加

import router from "./router";
var _hmt = _hmt || [];
        (function() {
            var hm = document.createElement("script");
            hm.src = "https://hm.baidu.com/hm.js?你的ak";
            var s = document.getElementsByTagName("script")[0];
            s.parentNode.insertBefore(hm, s);
        })();

router.afterEach( function( to, from, next ) {
    var topath = to.path
    var fullpath = to.fullPath
    if (_hmt) {
        setTimeout(() => {
            if (topath) {
                _hmt.push(['_trackPageview', '/'+process.env.VUE_APP_PROJECTNAME+'/#' + fullpath]);
            }
        }, 0);
    }
} );
//    这里因为我的路由mode是history,所以 _hmt.push(['_trackPageview', to.fullPath]),但是如果是hash的话,后面的路径要修改一下,改成
//    _hmt.push(['_trackPageview', '/#' + to.fullPath]);

百度地图api通过浏览器获取用户经纬度(web开发JavaScript -api)

应用场景:公众号嵌套h5页面,支付类必须有用户经纬度才能生成订单

  1. 申请百度地图ak
    ak会在引入百度js的时候用到,你可以点击这里申请一个唯一ak

  2. 引入百度地图js
    在public/index.html里面添加下面代码,注意把“你的ak”替换成你申请的ak

 <script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=你的ak"></script>
  1. 配置webpack
    由于cli3隐藏了webpack配置文件,所以我们需要在根目录创建一个vue.config.js文件,并写入下面代码
module.exports = {
  configureWebpack: {
    externals: {
      "BMap": "BMap"
    }
  }
}
  1. 单组件文件引入
    如果你是打算在单文件组件内使用(后缀为.vue文件),你可以参考下面代码
<script>
import BMap from 'BMap'
export default {
  name: 'Map',
  data () {
    return {
    }
  },
  methods: {
    goLocation(){
            var geolocation = new BMap.Geolocation();
            var that = this
            geolocation.getCurrentPosition(function(r){
              if(this.getStatus() == BMAP_STATUS_SUCCESS){
                 alert('您的位置:'+r.point.lng+','+r.point.lat);
              }
              else {
                  alert('failed'+this.getStatus());
              }
            },{enableHighAccuracy: true})
          }
  },
  mounted () {
    this.goLocation()
  }
}
</script>

微信浏览器授权之h5

使用场景:公众号嵌套H5项目
1.公众号中有公司之前开发的项目A产品,此次在增加其实是增加了新的项目B产品,但是要让用户感觉是之前项目的一个新功能(让B成为A的一个新功能)
2.B产品开发的时候打包的APP没有考虑到之后的h5,所以刚开始采用的是账号密码登入方式,如果是这样的话给用户感知一个项目之中需要登入俩次,很不和谐体验也很不好,后来改用授权方式登入
3.后台新增俩个接口
3.1微信网页授权接口----同步历史数据(手机号和openid),授权后如果已经绑定手机号,直接去是home
3.2绑定手机号接口-----授权后如果没有经绑定手机号去绑定,之前是注册接口只针对B项目,现在新增接口为了是俩个项目同步数据(通过token、和openid判断是否登录)

router.beforeEach((to, from, next) => {
  //判断登录逻辑
  var topath = to.path
  var realtopath = '' //真实跳转路径(去除参数)
  if (topath.indexOf('/', 2) != -1) {
    realtopath = topath.substring(0, topath.indexOf('/', 2))
  } else {
    realtopath = topath
  }
  if (realtopath.indexOf('/') != -1) {
    realtopath = realtopath.replace('/', '')
  }
  if(whiteList.indexOf(realtopath) != -1){
    //白名单,免登录
    next();
  }else if(checkLocalStorage('Token') && realtopath != 'shouquan'){
    //已经登录
    next();
  }else{
    //去登录
    Toast.clear()
      next({name: 'shouquan'})
  }
})


// response 拦截器
service.interceptors.response.use(
  response => {
    Toast.clear()
    console.log(response)
    //登录已过期,重新登录
    if(response.data.return_code == '10450' || response.data.return_code == '10451'){
      Toast('登录过期,请重新登录');
      removeLocalStorage('Token');
      router.push({name:'shouquan'})
    }else {
      return response
    }
  },
  error => {
    if(navigator.onLine){
      Toast('服务器繁忙,请稍后再试');
    }else{
      Toast('当前网络不可用,请检查您的网络连接');
    }
    return Promise.reject(error)
  }
)
新增授权页面
点击授权从定向到授权接口(此处是后端调取微信授权,我请求的是后端接口。)
 methods:{
      goauthorize(){
        window.location.href = '授权地址,后台回调的是绑定手机号页面'
      }
    },
mounted(){
	//拿缓存判断,如果第一次授权或者用户点击的退出,不自动授权需要用户点击授权按钮
	//如果token过期,(有效期20分钟)自动授权用户无感知
      document.title = '网页授权'
      if(checkLocalStorage('logined')){
          this.goauthorize();
      }

    }
mounted(){
	用户输入手机号页面,点击绑定会跳转到验证码页面
      document.title = '绑定手机号'
       //接收的是回调地址的参数,后台授权接口携带的
      this.openid = this.$route.query.openid
      token = this.$route.query.token
   
      if(token != ''){
        setLocalStorage('Token', token);
        setLocalStorage('logined');
        this.$router.push({name:'home'})
      }else {
        if(this.openid != ''){
          // 没有绑定手机号,还在当前页面
        }else{
            this.$router.push({name:'shouquan'})
        }
      }
    }

获取验证码,绑定成功
onInput(key) {
	//绑定事件
        if(this.code.length==4){
          // 绑定手机号
          var param = {action:'user_bind_phone',
          phone:this.phone,openid:this.openid,code:this.code,client_type :'h5'};
          linkapi(param).then(res=> {
            if (res.return_code == '000000') {
              var token = res.token;
              setLocalStorage('Token', token);
              setLocalStorage('logined');
              this.$router.replace({name:'home'})
            }else {
              Toast(res.return_msg);
            }
          });
        },
  mounted(){
      document.title = '注册'
      if(this.$route.params.phone) {
        this.phone = this.$route.params.phone
        this.openid = this.$route.params.openid
    }
用户点击退出登入
linkapi(param).then(res=> {
       if (res.return_code == '000000') {
           removeLocalStorage('token')
           removeLocalStorage('logined')
           this.$router.replace('shouquan')
         }else {
           Toast(res.return_msg);
         }
 });

动态路由

使用场景:在同一个页面菜单切换页面不变切换类目
解决方法:1.二级路由
2.动态路由
配置好了路由懒得换成二级路由所以采用动态路由:

router的path后面变成:type
 {
      path: "/article/:type",
      name: "article",
      component: () => import("./views/article.vue")
    },
//article页面用watch监听
watch: {
      '$route.path': function (newVal, oldVal) {
        document.title = '木棉情感 - 首页 - 干货分享 - '+ this.sort
      }
    }

修改v-html里面标签的样式

//vue单页面用less写的样式
  <div class="content" v-html="details.content"></div>
  .content{
            /deep/ img{
                width:100% !important;
                height:auto !important;
            }
        }

element-ui封装MessageBox 弹框及Message 消息提示

1.封装成一个方法,并直接挂载在Vue实例上:

// 放在main.js里面
//MessageBox 弹框
Vue.prototype.$alertMsgBox = function alert(msg = '确认要删除该数据?', title = '提示', settings = {}) {
  Object.assign(settings, {  //合并对象
    confirmButtonText: '确定',
    cancelButtonText: '取消',
    dangerouslyUseHTMLString: true //允许确认框内容为html格式
  })
  return this.$confirm(`<p style="font-weight:bold;">${msg}</p>`, title, settings)
}

//Message 消息提示
Vue.prototype.$messageOK = function alert(msg, title) {
  return this.$message({type: msg, message: title});
}
//无需引入直接使用
this.$alertMsgBox('确认删除此条信息吗', '操作')
      .then(() => {
          this.$messageOK("success", "已成功");
          console.log('确认')
        })
      .catch(() => {
          this.$messageOK("info", "已取消");
          console.log('取消')
 })

2.封装在js文件里面(以下是Message 消息提示demo):

创建一个js文件
这两个参数就是消息提示中的状态和内容

export function alertOK(msg, title) {
    this.$message({
        type: msg,
        message: title
    });
}
export default alertOK;
函数名随便起,完成操作后倒出去
在main.js引入设置全局
import message from "./common/message/inedx.js";
给它的原型加一个属性为$messageOK可以直接使用了
Vue.prototype.$messageOK = message;
页面中使用:
this.$messageOK("info", "已取消");
this.$messageOK("success", "已成功");

vue子组件接收props值并需要对这个值进行修改

vue组件传值是单向数据绑定,如果子组件直接将父组件传过来的props进行修改操作,会报一个警告
在这里插入图片描述
这时候需要在子组件data()重新定义一个值去接收报错的这个depByOrgList,下面是我项目中的代码

props: {
    depByOrgList:{
      type:Array,
    }
  },
  data() {
    return {
      thedepByOrgList: this.depByOrgList
    }
  },

使用一个变量thedepByOrgList去接收,子组件就可以满足对父组件传过来的值进行操作了.
但是这样还是会存在一个问题,thedepByOrgList这个属性只会在组件被创建的时候赋一次值,后续如果depByOrgList这个props值有变化,thedepByOrgList并不会自动同步,这时候就需要引入vue的一个属性监听函数

watch:{
    depByOrgList:function(val){
      this.thedepByOrgList=val
    }
  }

js动态往对象里边添加一项

第一种方法
let obj ={"name":"tom","age":16}
let key = "id";
let value = 2
obj[key] = value;
console.log(obj)
 
第二种方法,利用扩展运算符,简单又实用
var obj1={"vue":300,"jquery":200};
var obj2={"react":500};
var obj3={
	...obj1,
	...obj2
}
console.log(obj3)
 
第三种办法
let obj4 = {a:"1"};
let obj5 = {b:"2"};
let obj6 = {c:"3"};
Object.assign(obj4,obj5,obj6);
console.log(obj4)

js选取对象第一个值

var json = {颜色: "1708480395608103", 蓝色: "1708742016288631"};
var keyArr = Object.keys(json);
var val = json[keyArr[0]];
等同于以下:
打印Object.keys(json)出来是一个数组里面是key,用索引0来选取key在用获取对象方法 object[key]来获取值
json[Object.keys(json)[0]]

以formData格式上传文件

	//创建formData对象
		var formData = new FormData();
        formData.append("excelFile",file.raw)  //名字,file文件
        this.fileTemp = formData
//创建请求,配置请求头类型
const importInstance = axios.create()
        importInstance.defaults.baseURL= process.env.VUE_APP_BASE_API
        importInstance.defaults.headers = {
          'Content-Type' : 'multipart/form-data'
        }
        importInstance.defaults.timeout = 50000
        importInstance({
          method:'post',
          url:'/uploadTwbDeviceList',
          data:this.fileTemp //此处传formData对象
        })
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值