vue 项目开发,我遇到了这些问题

这篇博客汇总了Vue项目开发中遇到的各种问题及其解决方案,包括watch的immediate、路由跳转新窗口、输入框限制、事件监听、Vue-router错误、打包问题等,还涉及到element-ui组件的使用和优化,以及Vue组件间交互和生命周期的巧妙运用。
摘要由CSDN通过智能技术生成

日常工作中,使用vue进行项目开发居多,因此把一些vue项目常见问题进行总结,在此记录,避免以后开发中做过多的重复工作。

而掌握一些有用的技巧,使用一些更高级的技术点,也能让我们成为更好的 Vue 开发者

Watch immediate

当 watch 一个变量的时候,初始化时并不会执行,如下面的例子,你需要在created的时候手动调用一次。

// bad
created() {this.getsearchText();
},
watch: {searchText: 'getSearchText',
} 

你可以添加immediate属性,这样初始化的时候也会触发,代码也就可以简化成这样

// good
watch: {searchText: {handler: 'getSearchText',immediate: true,}
} 

vue路由跳转打开新窗口

使用 this.$router.resolve

const openNewUrl=(url) => {let routeData = this.$router.resolve({path: url})window.open(routeData.href, '_blank')} 

el-input 限制输入框只能输入数字

<el-input v-model.number="num"onkeyup="this.value = this.value.replace(/[^\d.]/g,'');"></el-input> 

el-input 过滤特殊字符或身份证脱敏

v-model拆分为:value和@input

<el-input :value="input" @input='e => input = idCardValid (e)' placeholder="请输入内容"></el-input> 
 methods:{idCardValid(val){const idCard= val.replace(/^(\d{6})\d+(\d{4})$/, "$1******$2")console.log(idCard)return idCard} 
}, 

使用a标签下载本地静态资源文件

  • 1、public目录下存放要下载的静态资源
  • 2、a 标签下载
 <a href="/demo.rar" download="demo.rar">点击下载</a> 

检测元素外部(或内部)的单击

例如我们检测一个id为 target 的 div 目标元素

let el= document.querySelector('#target')
window.addEventListener('mousedown', e => {
  // 获取被点击的元素
  const clickedEl = e.target;
  
  if (el.contains(clickedEl)) {
   //在 "el "里面点击了
  } else {
   //在 "el "外点击了
  }
}); 

iframe框架内页面控制父框架页面跳转到某地址

const { href } = this.$router.resolve({ path: "/index", query: { key: key } });
// iframe 控制父页面跳转
window.parent.window.location.href = href 

hookEvent

组件内使用

开发中用到定时器时我们一般这样

// bad
mounted() {// 创建一个定时器this.timer = setInterval(() => {// ......}, 500);},// 销毁这个定时器。
beforeDestroy() {if (this.timer) {clearInterval(this.timer);this.timer = null;}
} 

而借助 hook,可以更方便维护

// good
mounted() {let timer = setInterval(() => {// ......}, 500);this.$once("hook:beforeDestroy", function() {if (timer) {clearInterval(timer);timer = null;}});} 

监听子组件生命周期函数

原本

//父组件
<child
 :value="value"
 @childMounted="onChildMounted"
/>
method () {
 onChildMounted() {
 // do something...
 }
},

// 子组件
mounted () {
 this.$emit('childMounted')
}, 

hooks:

//父组件
<child:value="value"@hook:mounted="onChildMounted"
/>
method () {onChildMounted() {// do something...}
}, 

在Vue组件中,可以用过$on,$on

Vue 项目遇到跨域问题通常是因为浏览器出于安全考虑,限制了同源策略(Same-Origin Policy),不允许一个网页向另一个来源请求资源,除非两者来自同一个域名、端口和协议。这可能发生在从你的开发环境(例如本地开发服务器)向生产环境(如远程 API 服务)发送 AJAX 请求时。 解决跨域问题有以下几种常见方法: 1. **后端设置**: - 服务端(API 端)配置 CORS (Cross-Origin Resource Sharing)。可以在响应头添加 `Access-Control-Allow-Origin` 来指定允许的源,或者使用通配符 `*` 允许所有源访问。 ```javascript // Node.js express 中的例子 res.setHeader('Access-Control-Allow-Origin', '*'); ``` 2. **JSONP** (JSON with Padding): 使用 JSONP 是一种间接绕过同源策略的方法,通过动态插入 `<script>` 标签,但只适用于 GET 请求。 3. **代理** (Proxy): 使用 Vue CLI 的 proxy 配置,当向非本机地址发起请求时,可以通过一个本地代理转发到实际的目标地址。 ```json // vue.config.js devServer: { proxy: { '/api': { target: 'https://your-api.example.com', ws: true, // 如果需要 WebSocket 支持 changeOrigin: true, }, }, }, ``` 4. **CORS middleware** (Node.js 应用): 如果你的应用是基于 Node.js 的,可以安装并配置第三方库如 `cors` 或 `axios-proxy-middleware`。 5. **使用 Nginx 或其他反向代理服务器**: 对于部署环境,你可以配置 Nginx 为前端应用提供跨域支持。 6. **自签名证书** (仅限 HTTPS 开发环境): 如果只是开发环境,可以创建一个自签名证书并告诉浏览器信任它。 记住,这些解决方案中的每种都有其适用场景和局限性,选择最合适的方法取决于具体的项目需求。如果问题是由于 API 设计不合理导致的,可能需要与后端团队沟通调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值