Vue项目开发常见问题记录

本文聚焦Vue和Webpack开发中的常见问题及解决方法。界面问题涵盖监听数组、对象数据,双向绑定失效,动态属性名大小写,异步请求获取dom等;还涉及路由跳转、空模板组件报错,以及内网穿透显示错误等。脚手架和打包问题包括字体图标、图片加载问题,webpack-dev-server版本和vue-cli3升级报错等。

界面问题

监听数组指定下标的值
watch: {
  'arr[0]':function(val, old) { }
}
表单对象必须监听到基本类型的数据,val和old才会有区别
watch: {
  'form.id':function(val, old) { }
}
监听对象数据,子对象变化要val和old有区别

把对象深拷贝一份,然后监听拷贝的对象

data: ()=> {
    return {
		curve: {
		    min: {
		      value: [0,1]
		    }
		}
    }
},
computed: {
   cloneCurve() {
     return cloneDeep(this.curve); // 解决监听对象时新旧数据一样的问题
   }
}
watch: {
    cloneCurve: {
      handler(val, old) {
        console.log(val, old);
      },
      deep: true,
    },
  }
}
input默认输出的是字符串,想要输出数字

给v-model加上修饰符.number

<el-input
  v-model.number="curve.value"
  style="width: 100px"
  placeholder="请输入"
>
从接口请求到数据给重新对象赋值后双向绑定失效

调用方法:this.$set( target, key, value )
target:要更改的数据源(可以是对象或者数组)
key:要更改的具体数据
value :重新赋的值

Vue.set(obj,key,value)
//Or
this.$set(obj.key,value)

如果对象数据很多,可以通过循环处理

this.info.each((item) => {
  this.$set(this.newInfo, item.name, item.age)
})
console.log(this.newInfo)

如果数据层次太多,例如数组包对象,对象包数组,多层嵌套,会出现v-if调用失效,页面不重新渲染问题,解决办法为在数据处理完成之后调用$forceUpdate()发放:

this.$forceUpdate()
问题:动态属性名不能使用大写
<a v-bind:[className]="class"> 错误示例 </a>
<a v-bind:[classname]="class"> 正确示例 </a>
问题:异步请求数据在mouted中无法获取更新后的元素dom

解决方法1:在updated中获取(有网友说在beforeUpdate中用nextTick可以获取到,其实updated比beforeUpdate中的nextTick要先执行,所以在updated中能更早获取到。

解决方法2:上面的方式也不能适用于所有场景,比如初始化外部插件就不适用,因为每次更新data中的数据都会导致初始化,这并不是我们想要的,最后的解决方式是在created里的axios回调中用setTimeout延迟500~800秒再获取。

问题:在vue中两个组件在同一个界面而且有相同元素id,或者组件有设元素id而且在同一个界面复用,会导致功能失效

解决方法1:id命名需要谨慎,复用时需要考虑到冲突
解决方法2:使用ref代替id

问题:vue文件中SCSS引用图片路径报错

报错写法:

div { 
	background: url(@/assets/images/test.png);
}

解决方法:在@前面加~符号

div { 
	background: url(~@/assets/images/test.png);
}

问题:跳转重复路由报错

解决方法:在路由配置中加入下面代码

const originalPush = Router.prototype.push
Router.prototype.push = function push(location) {
  return originalPush.call(this, location).catch(err => err)
}

ts版

//获取原型对象上的push函数
const originalPush = VueRouter.prototype.push;
//修改原型对象中的push方法
VueRouter.prototype.push = function push(location: any) {
    return (originalPush.call(this, location) as any).catch((err: any) => err);
};
问题:空模板组件在v-if条件变化时报错

子组件用render(){}构建模版情况下,在父组件中给子组件加上v-if条件,某些时候条件变化就会报错找不到dom节点
在这里插入图片描述
解决方法:父组件有多个子组件的情况下,把该空模板子组件移到最前面就不报错了(这种方式虽然解决了问题,但具体原因还不知道)

问题:用花生壳内网穿透映射vue项目,访问页面显示“Invalid Host header”

解决方法:在vue.config.js里devServer对象下增加disableHostCheck: true

module.exports = {
  devServer: {
    disableHostCheck: true
  }
}

脚手架和打包问题

问题:打包后的文件放在服务器上运行字体图标变成方框

解决方法1: 在build > webpack.base.conf.js 里面loader的字体文件limit值设大一些,至少要比字体文件大
在这里插入图片描述
解决方法2: 在build > webpack.base.conf.js 里面通过url-loader配置路径
在这里插入图片描述

问题:打包后的图片过大无法转成base64,被转成静态文件放在静态资源里面,页面加载不到

解决方法: 在build > webpack.base.conf.js 里面通过file-loader配置路径
在这里插入图片描述

问题:webpack-dev-server的版本太高,无法启动在这里插入图片描述

解决方法:3.x以上的版本太高,降到2.11.3及以下即可
npm install webpack-dev-server@2.11.3 --save-dev

问题:升级vue-cli3后vue create xxx 报错

在这里插入图片描述
解决方法:版本不匹配,将vue改成和vue-template-compiler一样的版本

PS C:\projects> npm install vue@2.6.10 -g
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值