当前位置:   article > 正文

vue篇(技术总结 持续更新)_vue使用require报错

vue使用require报错

20230911 H5跳转到小程序,监听从小程序返回事件,执行刷新动作

  1. // 监听页面显示隐藏
  2. export const onPageShow = (callback) => {
  3. document.addEventListener("visibilitychange", () => {
  4. if (document.visibilityState === "visible") {
  5. console.log("监听页面显示");
  6. callback();
  7. }
  8. if (document.visibilityState === "hidden") {
  9. console.log("监听页面隐藏");
  10. const removeBtn = document.createElement("button");
  11. removeBtn.onclick = () => {
  12. window.removeEventListener("visibilitychange");
  13. };
  14. }
  15. });
  16. };
  17. import { onPageShow } from "@/utils/index";
  18. onPageShow(async () => {
  19. getTaskListData();
  20. });

20230907 长按图片识别二维码实现方案,监听长按事件,关闭弹窗

  1. <img @touchstart="start">
  2. const start = async () => {
  3. setTimeout(function () {
  4. gzhDialog.value = false;
  5. },500)
  6. };

20220822 elementUI v-for 对象数组 输入框不能输入下拉框无法选择

  1. this.$set(OriginData(Array/Object), key/index, tragetData);
  2. this.$set(this.data,'btns',[])
  3. 三个参数:
  4. 1、源数据,可以是数组或者对象
  5. 2、修改的目标, 数组时下标、对象是key
  6. 3、替换的新数据

20210928 vue常用的修饰符

  1. .trim v-model修饰符 自动过滤首尾空白字符 <input v-model.trim="msg">{{msg}}
  2. .lazy v-model修饰符 将input事件改为change事件 <input v-model.lazy="msg">{{msg}}
  3. .number 将输入值转为数值类型 <input type="number" v-model.number="msg">{{typeof(msg)}}
  4. .stop 事件修饰符 阻止事件冒泡 <button @click.stop="doThis"></button>
  5. .once 事件修饰符 事件将只触发一次 <button @click.once="agree"></button>
  6. .enter 键盘修饰符 监听键盘事件有动作时触发<input @keyup.enter="submit">
  7. .native 在父组件中给子组件绑定一个原生的事件 就将子组件变成普通的HTML标签

20210601 proxy配置代理遇到的一个问题

  1. proxy: {
  2. '/api': {
  3. target: process.env.VUE_APP_BASE_API,
  4. changeOrigin: true,
  5. pathRewrite: {
  6. '^/api': 'api'
  7. }
  8. },
  9. '/close': {
  10. target: process.env.VUE_APP_BASE_API,
  11. changeOrigin: true,
  12. pathRewrite: {
  13. '^/close': ''
  14. }
  15. }
  16. }

后台接口中有 api 前缀 无论是开发环境还是编译后的包 都不影响
后台接口中不存在close 开发环境 会进入代理 并将close移除掉 无影响
但是编译后的包 进入不到代理 请求接口回加上close前缀 导致接口404

20210511 require不存在的文件时如何避免报错

  1. this.bankList = res.data.filter((item, index) => {
  2. try {
  3. item.bankBgUrl = require('@/assets/images/bank/'+item.bankName+'.png')
  4. }
  5. catch(err){
  6. item.bankBgUrl = require('@/assets/images/bank/默认银行卡.png')
  7. }
  8. return item
  9. });

20210429 移除el-form表单校验

this.$refs[formName].clearValidate();

20210312 修饰符native和sync的区别

  • 组件上使用原生事件不生效时,只要加上native就可以了。例如:<hello @focus.native="fn1"></hello>
  • sync主要用于子组件要修改prop数据的一种语法糖,其作用是简化子组件自身想改变自身的数据。

20210201 ios端微信浏览器里keepAlive不生效的问题

  1. 1.在需要keepAlive的页面路由里配置对应的saveSrollTop:true(缓存滚动条位置)
  2. 2.用scrollBehavior处理滚动位置(滚动到之前存好的位置)
  3. export default new Router({
  4. scrollBehavior(to, from, savedPosition) {
  5. if (savedPosition) {
  6. return savedPosition;
  7. } else {
  8. if (from.meta.saveSrollTop) {
  9. from.meta.savedPosition = document.documentElement.scrollTop || document.body.scrollTop;
  10. }
  11. return {x: 0, y: to.meta.savedPosition || 0};
  12. }
  13. },

20210201 vant轮播图滑动时为什么触发了click事件

这种情况通常是由于项目中引入了fastclick库导致的。fastclick的原理是通过 Touch 事件模拟出 click 事件,而 Swipe 内部默认会阻止 touchmove 事件冒泡,干扰了 fastclick 的判断,导致出现这个问题。将 Swipe 组件的 stop-propagation 属性设置为 false 即可避免该问题。

20210201 h5视频组件配置封面和禁止默认全屏播放

<video controls :playsinline='true' :src="module.videoUrl" :poster="module.videoCover"></video>

20210129 移动端页面滚动到指定位置

document.getElementById("page").scrollIntoView();

20210113 uniapp获取当前页面路由及参数

  1. let routes = getCurrentPages(); // 获取当前打开过的页面路由数组
  2. let curRoute = routes[routes.length - 1].route; //获取当前页面路由
  3. let curParam = routes[routes.length - 1].options; //获取路由参数

20201229 vue框架中定义全局的方法

  1. // 在main.js中
  2. Vue.prototype.toPage = function(path, query) {
  3. router.push({
  4. path: path,
  5. query: query,
  6. });
  7. };
  8. // 在页面中
  9. this.toPage("/takeOutResult", {});

20201215 v-for列表数组使用下标赋值页面无更新 修改数组对象下数组对象值不更新

this.secondList = this.secondList.slice()

20201104 filter过滤器的使用

首先过滤器分为全局过滤器和局部过滤器,其主要用途是对页面数据进行批量处理。简化单个处理的繁琐操作逻辑,例如日期格式的处理等。

过滤器的使用

  • 先注册,后使用

  • 组件内 filters:{ 过滤器名: fn } fn 内通过 return 返回最终的数据

  • 全局 Vue.filter('过滤器名',fn) fn 内通过 return 返回最终的数据

  • 使用 {{ 数据 | 过滤器名 }}

过滤器的功能函数

  • 声明 function(data,argv1,argv2...){}

  • 第一个参数是传入的要过滤的数据,即调用时管道符左边的内容。

  • 第二个参数开始往后就是调用过滤器的时候传入的参数。

  1. <p v-for="(item,index) in 4">{{index|myFilter('xxx')}}</p>
  2. filters:{
  3. myFilter(value,value2){
  4. return value+value2;
  5. },
  6. },

20201104 watch和computed的区别是什么

watch和computed都是以Vue的依赖追踪机制为基础的,它们都试图处理这样一件事情:
当某一个数据发生变化的时候,所有依赖这个数据的“相关”数据“自动”发生变化,也就是自动调用相关的函数去实现数据的变动。

computed是一个计算的属性,可以对数据处理得到一个新的state,而watch是对原有的state做异步改变。
computed计算出来的的属性无需定义可以直接在dom中使用,该操作简化了模板中太多声明式的逻辑。

watch和computed各自处理的数据关系场景不同,watch擅长处理的场景:一个数据影响多个数据时computed擅长处理的场景:一个数据受多个数据影响时。总结:如果页面数据需要经过复杂计算就用 computed,如果一个数据需要被监听并且对其他数据做一些操作就用 watch。

  1. input type="text" v-model="aaa"> <span>{{bbb}}</span>
  2. <p v-for="(item,index) in 4">{{ccc(index)}}</p>
  3. data() {
  4. return {
  5. aaa:'张三',
  6. bbb:'',
  7. }
  8. },
  9. watch: {
  10. aaa:function(){
  11. this.bbb = this.aaa;
  12. },
  13. },
  14. computed:{
  15. ccc:function() {
  16. return function(e){
  17. return e*2 + this.aaa;
  18. }
  19. }
  20. },

20201104 enum枚举的理解和使用

个人理解:更像是一个常量数组,本质就是键值对的形式,用于取值被限定在一定范围内的场景,比如一周只能有七天等。
枚举使用 enum 关键字来定义:enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat}。
枚举成员会默认被赋值为从 0 开始递增的数字,同时也会对枚举值到枚举名进行反向映射。字符串枚举不会进行反向映射。
当然也可以手动赋值,未手动赋值的枚举项会接着上一个枚举项递增。
如果未手动赋值的枚举项与手动赋值的重复了,TypeScript 是不会察觉到这一点的,但反向取值的是时候是会被覆盖掉的。

20201104 vue如何自定义指令

官方解释:对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。
尝试理解:指令中封装了一些 DOM 行为,对于页面和数据更为方便的输出,这些操作就叫做指令。

vue常用内置指令:v-bind、v-model、v-if、v-show、v-else、v-for、v-html、v-text、v-on等。
自定义指令提供了五个勾子函数:bind、inserted、update、componentUpdated、unbind。

自定义指令分为:全局指令、局部指令。还包含:带参数的自定义指令。

参考文章:
自定义指令 — Vue.js
Vue自定义指令及使用 - sugar_coffee - 博客园
[vue]使用自定义指令实现表单校验_让勤奋成为习惯-CSDN博客_vue 自定义指令表单验证

20201019 elementUI只能选最近12周和前三个月

  1. // 禁用周
  2. pickerOptions2: {
  3. disabledDate: (time) => {
  4. // 上周周日 = 当前日期-当前周几
  5. var current = (new Date().getTime())-24*60*60*1000*(new Date().getDay())
  6. // 12周以前周日 = 当前时间 - 12周时间
  7. let week12 = 24 * 60 * 60 * 1000*7*12;
  8. let week12Ago = current-week12;
  9. // 禁用大于上周周日的部分 和小于12周以前的部分
  10. return time.getTime() > current || time < week12Ago
  11. },
  12. firstDayOfWeek:1, // 设置从周一开始
  13. },
  14. // 禁用月
  15. pickerOptions: {
  16. disabledDate: (time) => {
  17. // 获取前三个月时间
  18. let date1 = new Date();
  19. date1.setMonth(date1.getMonth()-2);
  20. let year1=date1.getFullYear();
  21. let month1=date1.getMonth();
  22. month1 =(month1<10 ? "0"+month1:month1);
  23. let three = (year1.toString()+'-'+month1.toString());
  24. // 禁用三个月前 和当月之后
  25. let min = new Date(three).getTime()
  26. var current = new Date()
  27. return time.getMonth() >= current.getMonth() || time < min
  28. },
  29. },

20200929 在有多个echarts图表的vue页面中 首次进入页面会滚到中间 处理方法

document.querySelector('.report').scrollIntoView({ behavior: 'smooth' })

20200922 在router-link上添加click事件会被拦截无效,需要加.native修饰符

20200921 做@input时,使用传统input标签,输入汉字时可能会出现接口调用多次的情况,可改用el-input标签,避免问题产生。例:资讯搜索

20200910 vue多层循环,动态改变数据后渲染的很慢或者不渲染

  1. 可在动态改变数据的方法 第一行加上 this.$forceUpdate(); 例如:
  2. foldComment(row:any){
  3. this.$forceUpdate();
  4. this.commentInfo.commentList.map(function(item:any) {
  5. if(item.commentId==row.commentId){
  6. item.isShowMoreComment = !item.isShowMoreComment
  7. return item;
  8. }
  9. })
  10. }

20200909 el-table高度自适应

  1. :maxHeight="tableHeight"
  2. tableHeight:window.innerHeight-300

20200907 blur事件优先于click事件问题

可采用mousedown来代替click

20200811 vue中局部页面滚动到最底部

  1. this.$nextTick(() => {
  2. let tablePar = this.$refs["container"];
  3. tablePar.scrollTop = tablePar.scrollHeight;
  4. });

20200805 elementUI文本域自适应高度并且给最大行数

<el-input type="textarea" :autosize="{maxRows:4}"></el-input>

20200804 如何修改el-table文本超出show-overflow-tooltip的显示宽度

<style lang="scss"> .el-tooltip__popper{ max-width:50% } </style>

20200730 在vue的template结构里面使用moment日期格式化组件需要再data里面返回一下

  1. cnpm i moment --save
  2. import moment from 'moment'
  3. data() {
  4. return {
  5. moment,
  6. <template slot-scope="scope">
  7. <span>{{moment(scope.row.updatedDate).format('YYYY-MM-DD')}}</span>
  8. </template>

20200728 el-table行内嵌入el-input做当行修改时 启用禁用通过配置disabled属性无效 可能是因为该属性不是原有的 可通过先配置属性再赋表格数据的方式来解决

  1. if (res.code === 200) {
  2. let list = res.data;
  3. this.recordList = list.map(function(item) {
  4. item.disabled = true;
  5. return item;
  6. })
  7. }

20200707 vue如何获取上一个返回页面的路由

  1. beforeRouteEnter(to, from, next) {
  2. next(vm=>{
  3. // 这里的vm指的就是vue实例,可以用来当做this使用,赋值需用vm
  4. console.log(to)
  5. console.log(from)
  6. })
  7. }

20200706 IP有端口号 域名不会有端口号 域名是解析过的

20200703 vue从详情页返回列表保存列表位置状态不变

  1. router里面配置 meta: { keepAlive: true },
  2. 位置确实记录上了(加缓存,返回不刷新页面),弊端就是返回不触发created和mounted,
  3. 所以有些页面需要返回触发的东西都写在activated里面。

20200702 vue如何阻止事件冒泡

  1. <div v-for="(item, index) in list" @click="handleClick">
  2. <span @click.stop="handleClick2"></span>
  3. </div>

20200701 vue的element上传图片成功回调参数传参数下标

  1. :on-success="handleAvatarSuccess.bind(this,items.TagName)"
  2. // 利用es5的bind函数! this是当前,items.TagName是携带的参数
  3. handleAvatarSuccess (idx, res, file, name) {
  4. console.log(res)
  5. console.log(file)
  6. console.log(idx)
  7. console.log(name)
  8. this.orderInfo['idx'] = URL.createObjectURL(file.raw)
  9. },
  1. <el-upload
  2. :action="questionUploadFile"
  3. :show-file-list="false"
  4. :on-success="handleAvatarSuccess.bind(this,index,index2)"
  5. :before-upload="beforeFileUpload"
  6. :on-change="fileChange">
  7. <img v-if="option.imageUrl" :src="option.imageUrl">
  8. <i v-else class="el-icon-picture-outline" style="font-size: 20px;margin-right: 6px;margin-top: 4px;"></i>
  9. </el-upload>
  10. handleAvatarSuccess(index,index2,res,file) {
  11. console.log(index,index2)
  12. console.log(res)
  13. console.log(file)
  14. console.log(URL.createObjectURL(file.raw)) // 打印本地路径
  15. if (res.code === 200) {
  16. this.list[index].questionChoiceList[index2].imageUrl = res.data;
  17. }
  18. },

20200320 方法中如何同时传event和参数

<input type="file" name="file" @change="getImage($event,scope.$index)"/>

20200227 el-table表格出现抖动闪动情况

  1. .el-table{
  2. width:99.9%;
  3. }

20200121 vue 报错:Cannot read property '_wrapper' of undefined

通常情况下是@click的方法没有在methods中定义,一个个去排查吧

20200117 el-select设置value为对象

普通的,如果直接传对象,会显示如下效果,解决办法:el-select加value-key属性唯一标识

  1. <el-select
  2. value-key="fundCode"
  3. v-model="data.mainType"
  4. default-first-option>
  5. <el-option
  6. v-for="item in fundList"
  7. :label="item.fundName"
  8. :value="item"
  9. :key="item">
  10. </el-option>
  11. </el-select>


20200109 el-table勾选和取消勾选以及获取勾选的值

  1. // 勾选和取消勾选 rows为数组 type为true或false
  2. toggleSelection(rows,type) {
  3. if (rows) {
  4. rows.forEach(row => {
  5. this.$refs.multipleTable.toggleRowSelection(row,type);
  6. });
  7. } else {
  8. this.$refs.multipleTable.clearSelection();
  9. }
  10. },
  11. // 获取勾选的值 拿到的是数组
  12. handleSelectionChange(val) {
  13. this.multipleSelection = val;
  14. }

为什么vue组件中data必须是一个函数而不是对象

  1. 在new vue()中 data可以直接是一个对象
  2. new Vue({
  3. el: '#app',
  4. template: `<div>{{name}}</div>`,
  5. data: {
  6. name: 'tony'
  7. }
  8. })
  9. 为什么在vue组件中 data必须是一个函数呢?
  10. 我们大致可以通过js原型链来对比下:
  11. var Component = function() {};
  12. Component.prototype.data = {
  13. demo: 123
  14. }
  15. var component1 = new Component();
  16. var component2 = new Component();
  17. component1.data.demo = 456;
  18. console.log(component2.data.demo); // 456
  19. 从上面可以看出,两个实例都引用同一个对象,其中一个改变的时候,另一个也发生改变。
  20. 每一个vue组件都是一个vue实例,通过new Vue()实例化,引用同一个对象。
  21. 如果data直接是一个对象的话,那么一旦修改其中一个组件的数据,其他组件相同数据就会被改变。
  22. data是函数的话,每个vue组件的data都因为函数有了自己的作用域,互不干扰。

多个路由指向同一个组件来回切换时不刷新问题

  1. 第一种.<router-view :key="$route.path">
  2. 第二种.组件页面中加watch监听 监听变化
  3. export default {
  4. watch: {
  5. '$route' (to, from) {
  6. console.log('to=' + to)
  7. this.reload()
  8. }
  9. }
  10. }
  11. 第三种.使用vue2.2中引入的beforeRouteUpdate导航守卫(原理同上者,方式略不同)
  12. <template>
  13. <router-view ></router-view>
  14. </template>
  15. export default {
  16. beforeRouteUpdate (to, from, next) {
  17. console.log('routeUpdate:to=' + to.fullPath + ';from=' + from.fullPath)
  18. next()
  19. }
  20. }

elementUI tree树形控件选择了子节点如何同时获取父节点

this.$refs.tree.getHalfCheckedKeys().concat(this.$refs.tree.getCheckedKeys())

element-ui框架的el-dialog弹出框被遮罩层挡住了

解决办法:在el-dialog标签里添加 :modal-append-to-body='false'或append-to-body

编辑时表单中el-radio el-check无法点击选择的情况

  1. form对象从row拿到的值没有包含当前属性 直接赋值的话就会出现这种情况
  2. 解决办法:用$set赋值  this.$set(this.form,'isMaxNums',this.form.IssueQuantity>10000?2:3);
  3. 2020.7.6再次遇到:self.$set(item,'radio',null); self.$set(item,'check',[]);

vue-cli项目build后 部署到服务器 css/js报404

修改config目录下index.js 里面的assetsPublicPath: '/' 为assetsPublicPath: './'

如何修改v-html内图片的或文字的样式

单独写一个style标签 加样式

vue-cli项目性能加载优化

  1. 1.vue-router路由懒加载(解决vue项目首次加载慢)
  2. 2.vue-cli代码包优化 屏蔽SourceMap(配置productionSourceMap: false

vue页面数据更新后如何回滚到最顶部

  1. 刚开始用的scrollTo(0,0) 发现时灵时不灵 改进之后 先获取当前页面节点 再去滚动
  2. document.getElementsByClassName('news_detail')[0].scrollTo(0,0);

elmentUI+vue实现多选框遍历数组对象

  1. // 需要label的是整个对象 而不是具体的id或name
  2. <template>
  3. <el-checkbox-group v-model="checkedCities">
  4. <el-checkbox v-for="city in cities" :label="city" :key="city.id">{{city.cityName}}</el-checkbox>
  5. </el-checkbox-group>
  6. </template>
  7. <script>
  8. export default {
  9. data() {
  10. return {
  11. checkedCities: [{id: 1, cityName: '上海'}],
  12. cities: [{id: 1, cityName: '上海'}, {id: 2, cityName: '北京'}]
  13. };
  14. }
  15. };
  16. </script>
  17. // 以上写法 针对对象数组 有时候也无效 可用label去控制id 默认选中的checkedCities也给id数组
  18. <el-checkbox-group v-model="checkedCities" @change="handleCheckedCitiesChange">
  19. <el-checkbox v-for="(city,index) in cities" :label="city.id" :key="index">{{city.name}}</el-checkbox>
  20. </el-checkbox-group>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT领航者/article/detail/62769
推荐阅读
相关标签
  

闽ICP备14008679号