Vue+Typescript记录

报错:TypeScript emitted no output for

解决方法:
ts混入的方法:https://www.cnblogs.com/zhongchao666/p/11207117.html
解决问题的方法:https://stackoverflow.com/questions/54413763/trading-view-typescript-emitted-no-output

导入js文件如@/api/aaa.js的函数报错找不到此内容(有问题)

解决方法:
修改tsconfig.json中的compilerOptions,将其中的"allowJs"设为true,如: “allowJs”: true
在tsconfig中的"include"字段中将js文件的路径添加进去。

{
  "compilerOptions": {
  	...
  	"allowJs": true, // 允许编译javascript文件
	"include": [
  		"src/**/*",
  		"types",
  		"./src/api/equipment/*.js" //匹配equipment下的所有js文件
	],
	...

TS下,form表单验证validate报错

validate找不到类型,此时可以使用类型断言,将 validate 断言成: HTMLFormElement

(this.$refs[aaaa] as HTMLFormElement).validate();

父组件调用子组件方法,TS不识别this.$refs

暂时的解决方法:先拿到对应的元素,定义其类型再拿到对应的方法

let flv:any = this.$refs.flvV
flv.endFlvVideo()

Element-Ui样式失效问题

vue.config.js配置文件里css的requireModuleExtension: 改为true

使用ElementUI遇到TS的问题Property ‘resetFields’ does not exist on type ‘Vue’

使用类型断言

let ref = (this.$refs.queryForm as ElForm)
ref.resetFields()

在js部分中使用this.$t报错:Cannot read property ‘_t’ of undefined"

引入vue-i18n配置文件中的i18n,在页面中采用i18n.t替换this.$t(’…’)

//
import i18n from "@/locales"
...
//js代码中
i18n.t('login.usernameRule')

交换elementui的messagebox的取消和确认按钮位置,改为确认在前

this.$msgbox({
	...
	cancelButtonClass: "btnCancel",
	...
})
// style
.btnCancel{
  float: right;
  margin-left: 10px;
}

echarts自适应宽度

  mounted() {
  	this.chart = echarts.init((this.$refs.flowChart as any), "macarons");
    this.chart.setOption(this.chartOptions);
    window.addEventListener("resize", this.resizeChart);
    this.$on("hook:beforeDestroy", () => {
      window.removeEventListener("resize", this.resizeChart)
    })
  }
  
  //resize
  private resizeChart() {
    this.chart.resize();
  }

遮罩层阻止默认滚动事件

<div class="dialog" @touchmove.prevent.stop @mousewheel.prevent></div>

如何判断鼠标按下的是左键还是右键

private mouseDown(e:MouseEvent) {
	e.which == 1;  //鼠标左键
	e.which == 3//鼠标右键
}

使用onmousemove时,鼠标移动过快会导致图形跟不上或者事件不全部响应

原因:鼠标移动时,不会存储所有的移动信息,而是通过取插值的方法取得鼠标位置信息,否则,系统会被鼠标移动拖垮。所以就会出现,移动过快时,出现断点的问题。
解决方案:使用相对于整个浏览器窗口的坐标来定位。

private mouseDown(e: MouseEvent) {
	...
	let a:DOMRect = this.timeSelect.getBoundingClientRect() // 获得相对于浏览器的坐标
	this.offectXY[0] = e.clientX - a.x;  //用相对于浏览器的坐标以免鼠标移动过快导致位置出错
	...
	this.selectBar.style.left = this.offectXY[0].toString() + "px";
	//添加鼠标移动事件
    document.onmousemove = (e: MouseEvent) => {
    	...
    	this.offectXY[1] = e.clientX - a.x;
	    this.selectBar.style.width = this.offectXY[1] - this.offectXY[0] + "px";
    }
}

await语句后面的promise变为reject,那么整个async函数都会中断执行

await命令,会阻塞代码,如果函数体中有一个await语句后面的promise变为reject,那么整个async函数都会中断执行。但是我们希望即使前一个异步操作失败,也不要中断后面的异步操作。解决办法:将await放在try …catch结构里面

this.loading = true;
try {
  await UserModule.Login(this.loginForm);
} catch (error) {
  console.log(error)
}
  this.loading = false;
  this.$router.push({
    path: this.redirect || "/",
    query: this.otherQuery,
  });

Vue-Router升级导致的Uncaught (in promise)问题

解决方法:在调用方法的时候用catch捕获异常

...
this.$router.push({
  path: this.redirect || "/",
  query: this.otherQuery,
}).catch(err =>{ err })
...

动态添加路由,跳转页面时,页面报错路由重复: [vue-router] Duplicate named routes definition: {…}

原因:addRoutes 方法仅仅是注入新的路由,并没有剔除原有的其它路由
解决方法:使用router.addRoutes(routes)之前调用resetRouter()清空路由

//router.ts
...
export function resetRouter() {
  const newRouter = createRouter();
  (router as any).matcher = (newRouter as any).matcher; // reset router
}
...

//premission.ts
...
import { resetRouter } from "./router"
...
router.beforeEach(async (to: Route, from: Route, next: any) => {
...
  resetRouter();
  router.addRoutes(accessedRoutes);
...
}

el-select框中出现数字的解决方法

el-select 默认以字符串进行匹配,现实情况中后端经常存整型,el-select 默认会原样输出
解决办法:el-option中的:value转为整形

<el-select size="mini" v-show="scope.row.show" v-model="scope.row.type">
  <el-option
    v-for="item in typeOptions"
    :key="item.value"
    :label="item.label"
    :value="parseInt(item.value)"
  >
  /el-option>
</el-select>
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面为您提供一份实现el-dialog弹框拖拽的代码,包含详细注释,并且可以作为公共方法供其他组件调用。 首先,我们先创建一个mixin,命名为`dialogDragMixin.ts`,在该文件中实现弹框拖拽的功能。 ```typescript import { DirectiveBinding } from 'vue'; import { ElDialog } from 'element-plus'; // 定义接口,用于存储弹框的位置信息 interface DialogPosition { top: number; left: number; } // 定义一个变量,用于存储弹框的位置信息 let dialogPosition: DialogPosition = { top: 0, left: 0 }; export default { // 指令钩子函数,当元素插入到 DOM 中时执行 mounted(el: HTMLElement, binding: DirectiveBinding) { // 获取el-dialog组件实例对象 const dialog: ElDialog = binding.instance.$parent as ElDialog; // 获取弹框的标题栏元素 const dialogHeaderEl: HTMLElement = el.querySelector('.el-dialog__header')!; // 设置标题栏的样式,使其可以被拖拽 dialogHeaderEl.style.cursor = 'move'; dialogHeaderEl.style.userSelect = 'none'; // 鼠标按下事件处理函数 const handleMouseDown = (event: MouseEvent) => { // 记录鼠标按下时的位置信息 dialogPosition.top = dialog.$el.offsetTop; dialogPosition.left = dialog.$el.offsetLeft; // 记录鼠标按下时的坐标信息 const mouseX = event.clientX; const mouseY = event.clientY; // 鼠标移动事件处理函数 const handleMouseMove = (event: MouseEvent) => { // 计算鼠标移动时的偏移量 const offsetX = event.clientX - mouseX; const offsetY = event.clientY - mouseY; // 更新弹框的位置信息 dialog.$el.style.top = dialogPosition.top + offsetY + 'px'; dialog.$el.style.left = dialogPosition.left + offsetX + 'px'; }; // 鼠标抬起事件处理函数 const handleMouseUp = () => { // 移除鼠标移动事件处理函数和鼠标抬起事件处理函数 document.removeEventListener('mousemove', handleMouseMove); document.removeEventListener('mouseup', handleMouseUp); }; // 添加鼠标移动事件处理函数和鼠标抬起事件处理函数 document.addEventListener('mousemove', handleMouseMove); document.addEventListener('mouseup', handleMouseUp); }; // 添加鼠标按下事件处理函数 dialogHeaderEl.addEventListener('mousedown', handleMouseDown); } } ``` 接下来,我们在需要使用该mixin的组件中引入它,并将其添加到`mixins`属性中即可。 ```vue <template> <el-dialog title="Dialog Title" :visible.sync="dialogVisible" width="30%" :before-close="handleClose" v-dialogDrag > <span>Dialog Content</span> <span slot="footer" class="dialog-footer"> <el-button @click="dialogVisible = false">Cancel</el-button> <el-button type="primary" @click="dialogVisible = false">Confirm</el-button> </span> </el-dialog> </template> <script lang="ts"> import { defineComponent } from 'vue'; import dialogDragMixin from './dialogDragMixin'; export default defineComponent({ name: 'MyComponent', mixins: [dialogDragMixin], data() { return { dialogVisible: false }; }, methods: { handleClose(done: () => void) { this.$confirm('Confirm to close this dialog?') .then(() => { done(); }) .catch(() => {}); } } }); </script> ``` 最后,我们可以将`dialogDragMixin`作为一个公共方法,供其他多个组件调用。在`main.ts`中,全局注册该mixin即可。 ```typescript import { createApp } from 'vue'; import App from './App.vue'; import ElementPlus from 'element-plus'; import 'element-plus/lib/theme-chalk/index.css'; import dialogDragMixin from './dialogDragMixin'; const app = createApp(App); // 注册全局mixin app.mixin(dialogDragMixin); app.use(ElementPlus).mount('#app'); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值