Wiidede's blog Wiidede's blog
  • 前端
  • Python
  • 算法
  • 生活
  • 其他
  • 分类
  • 标签
  • 归档
  • 关于我
  • 赞赏
  • 我的小站 (opens new window)
GitHub (opens new window)

Wiidede

小的的写前端
  • 前端
  • Python
  • 算法
  • 生活
  • 其他
  • 分类
  • 标签
  • 归档
  • 关于我
  • 赞赏
  • 我的小站 (opens new window)
GitHub (opens new window)
  • 整理一些css样式
  • vue隔代组件层层动态插槽并且附带数据
  • vue判断字符串是否溢出来显示弹窗、解决el-table tooltip 内过多导致无法显示,内容闪烁
  • 整理一些js写法
  • ElementUI timePicker 增加此刻按钮 引发的dom操作的学习
  • 毕业设计(水表识别)前端知识整理
  • html小知识
  • axios请求api然后下载文件
  • vue3+ts根据高度改变元素的透明度
  • vue3 + ElementPlus 换肤方案(Css变量)
  • Moment的一些使用方法
  • echarts基础vue组件
  • element UI el-date-picker 年月日切换组件
  • 可以不选择的el-radio单选框
  • vue的小技巧总结
    • 当用户按下ENTER键时切换下一个表单输入
    • 动态刷新(重新加载)特定组件
    • 组件Props传值验证
    • 路由更改时进行某些操作
    • 属性事件传递
    • 长列表性能优化
    • 监听组件的生命周期
  • 全局动态权限判断(Vue指令)
  • vue-anchor 探索
  • Deep Dive with Evan You 笔记
  • 前端基础知识查漏补缺
  • WebPack 知识总结
  • 我写的一些可以日后参考的代码
  • 接口变化后,封装接口函数,改变返回内容
  • 项目组件整理
  • 前端框架设计想发
  • 全局进度条
  • 带有token的图片vue组件:authImg,使用axios下载图片
  • 前端npm包推荐
  • 给ElInputNumber添加prefix
  • ElPagination添加页数总数
  • el-tab做成chrome类似的tab样式
  • vue-grid-layout-组件配置
  • 项目数据字典封装
  • 图表组件响应式探索
  • ElementPlus表格table列自动合并composition
  • 简单的curd组件封装
  • ElementPlus表格自定义合计列composition
  • 一些处理表格数据composition api
  • div内容溢出后,内容向左悬浮,vue组件封装
  • 文本数字溢出后,按比例缩小,vue组件封装
  • 表格使用async-validator检验composition
  • ElementPlus Form一些简单的组件整合
  • arco-design快速使用tailwind的颜色、unocss动态颜色
  • 前端
wiidede
2021-12-27

vue的小技巧总结

# title: vue的小技巧总结

作者:Web前端技术委员会

# 当用户按下ENTER键时切换下一个表单输入

当我们使用Vue时,如果需要处理一些键盘事件。例如在输入框时,需要按下 Enter 键,切换到下一个输入框, 我们可以通过@keyup.enter快速实现这个功能:

<input
    type="text"
    @keyup.enter="$event.target.nextElementSibling.focus()"
/>
1
2
3
4

# 动态刷新(重新加载)特定组件

某些情况下,我们需要重新加载组件而不影响它所在页面的其他部分。虽然我们无法主动触发Vue组件渲染, 但是我们可以通过变更组件的Key值来实现组件刷新。

<template>
  <component-to-re-render :key="reloadMe"/>
</template>

<script>
export default {
  data() {
    return {
      reloadMe: 0,
    }
  },

  methods: {
    forceRerender() {
      this.reloadMe += 1;
    }
  }
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

当然,如果你想重新加载整个页面的话,可以通过以下代码:

window.location.reload()
this.$router.go(0)
1
2

# 组件Props传值验证

我们在props传值的时候,除了可以指定某个属性的类型,还支持通过validator自定义校验函数, 将传入的值限制到某些范围,我们可以在检测传入是否存在错误的同时,也更方便其他同事查看我们组件代码时, 了解该属性可以接受哪些值。

<template>
  <button
      :disabled="disabled"
      :type="type"
  >
    <slot/>
  </button>
</template>

<script>
export default {
  props: {
    type: {
      type: String,
      validator: s => ['submit', 'reset'].includes(s)
    },
    disabled: {
      type: Boolean,
      default: false
    }
  }
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 路由更改时进行某些操作

如果我们想要在路由变化时,对某些组件进行操作,我们可以在对应的组件中使用watch来监听路由变化。 例如某个长列表,我们将他滚动到底部切换页面,切换回来后想让他回到顶部,那么我们可以:

<script>
export default {
  watch: {
    // 为什么不用路由守卫啊,不明白这么写的原因?——搬运者注
    $route() {
      window.scrollTo(0, 0)
    }
  }
}
</script>
1
2
3
4
5
6
7
8
9
10

# 属性事件传递

写过高阶组件的童鞋可能都会碰到过将加工过的属性继续向下传递的情况,如果碰到属性较多时, 需要一个个去传递,非常不友好并且费时,有没有一次性传递的呢?举个例子, 假如有一个基础组件 ChildComponent,只有基础的列表展示功能,现在我们想在这基础上增加排序功能, 这个时候我们就可以创建一个高阶组件 Parent 。 我们只需要将当前组件的$props和$listeners通过v-bind和v-on一起传递下去。

<!--Parent.vue-->
<template>
  <ChildComponent v-bind="$props" v-on="$listeners"/>
</template>
1
2
3
4

# 长列表性能优化

我们应该都知道 vue 会通过object.defineProperty对数据进行劫持,来实现视图响应数据的变化, 然而有些时候我们的组件就是纯粹的数据展示,不会有任何改变,我们就不需要vue来劫持我们的数据, 在大量数据展示的情况下,这能够很明显的减少组件初始化的时间,那如何禁止vue劫持我们的数据呢? 可以通过 object.freeze 方法来冻结一个对象,一旦被冻结的对象就再也不能被修改了。

另外需要说明的是,这里只是冻结了user的值,引用不会被冻结,当我们需要reactive数据的时候, 我们可以重新给user赋值。


<script>
export default {
  data: () => ({
    users: {}
  }),
  async created() {
    const users = await axios.get("/api/users");
    this.users = Object.freeze(users);
  }
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12

# 监听组件的生命周期

这里提供一种特别简单的方式,子组件不需要任何处理,只需要在父组件引用的时候通过 @hook 来监听即可, 代码如下:

<ChildComponent @hook:mounted="doSomething"/>
1

当然这里不仅仅是可以监听mounted,其它的生命周期事件,例如created、updated等都可以.

#前端#Vue
上次更新: 2023/06/01, 12:40:50

← 可以不选择的el-radio单选框 全局动态权限判断(Vue指令)→

Theme by Vdoing | Copyright © 2021-2023 Wiidede | Website use MIT License | Article content & logo use CC-BY-SA-4.0 License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式