vue2和vue3中好用的数据重置方法

前言

我们在做一些数据查询的时候,往往会有重置按钮,这个时候,如何把数据快速重置回初始数据就是一个问题了。

基础重置

对于前端初学者来说,大部分人会选择把data里的数据重新赋值一遍,如:

<script>
export default {
  data() {
    return {
      listQuery: {
        name: undefined,
        sex: 1,
        mobile: null,
        age: undefined,
        type: "",
      },
    };
  },
  methods: {
    handleReset() {
      this.listQuery = {
        name: undefined,
        sex: 1,
        mobile: null,
        age: undefined,
        type: "",
      };
    },
  },
};
</script>

这么做并不是什么好的选择,因为如果查询字段过多,就会显得代码很冗余。

Vue2中数据重置最佳实践

vue2中我们可以使用一种依赖于选项 API 内部的解决方法$options

<script>
export default {
  data() {
    return {
      listQuery: {
        name: undefined,
        sex: 1,
        mobile: null,
        age: undefined,
        type: "",
      },
    };
  },
  methods: {
    handleReset() {
      Object.assign(this.listQuery, this.$options.data().listQuery);
    },
  },
};
</script>

短短的一行代码就实现了数据重置,更不用关注listQuery里有多少字段,优雅而便捷。

Vue3中数据重置最佳实践

vue3我们更倾向于使用组合式API,而不是在vue3里继续使用vue2的选项式API语法;所以vue2中$options就没法直接使用了。我们在这里推荐一种可重用函数的写法,也十分实用。

<script setup>
import { reactive } from "vue";
//定义可重用函数和初始数据
const originData = () => ({ name: "", age: "" });
//赋值
const listQuery = reactive(originData());
listQuery.name = "皮卡丘";
listQuery.age = 10;
//数据重置
const handleReset = () => {
  Object.assign(listQuery, originData());
};
</script>

可重用函数既可以用来定义初始数据,也可以用来重置数据,是不是也显得很优雅。

大家赶快在项目里运用起来吧~

拓展:

vue2和vue3的区别?

Vue 2 和 Vue 3 是 Vue.js 框架的两个主要版本,它们在许多方面都有所不同。以下是一些主要的区别:

1. 性能优化

  • Vue 2: Vue 2 使用虚拟 DOM,但它的虚拟 DOM 实现相对较重,并且在某些情况下可能会导致性能问题。
  • Vue 3: Vue 3 引入了 Proxy 作为其响应式系统的基础,这比 Vue 2 的 Object.defineProperty 更加高效和灵活。此外,Vue 3 还引入了编译时的优化,如静态树提升和静态属性提升,这些优化可以显著提高应用的性能。

2. Composition API

  • Vue 2: Vue 2 主要依赖于 Options API,通过选项(如 data、methods、computed 等)来组织代码。
  • Vue 3: Vue 3 引入了 Composition API,它提供了一种更灵活的方式来组织和重用逻辑。Composition API 允许开发者将相关的逻辑组织在一起,而不是被限制在组件选项中。

3. Fragments

  • Vue 2: Vue 2 组件只能有一个根元素。
  • Vue 3: Vue 3 支持组件有多个根元素(Fragments),这使得开发者可以更灵活地组织组件结构。

4. Teleport

  • Vue 3: Vue 3 引入了 Teleport 组件,它允许开发者将组件渲染到 DOM 树的其他位置,而不是当前组件的父级。这在处理模态框、通知等场景时非常有用。

5. Suspense

  • Vue 3: Vue 3 引入了 Suspense 组件,它允许开发者处理异步组件的加载状态。Suspense 可以与 Composition API 一起使用,以更优雅地处理异步操作。

6. 自定义渲染器

  • Vue 3: Vue 3 提供了更灵活的自定义渲染器 API,这使得开发者可以创建自己的渲染器,如用于原生 Web Components 的渲染器。

7. TypeScript 支持

  • Vue 3: Vue 3 是用 TypeScript 编写的,并且对 TypeScript 提供了更好的支持。这使得 Vue 3 更适合大型项目和团队协作。

8. 其他变化

  • 全局 API 的变化: Vue 3 对全局 API 进行了重构,许多全局 API 现在是应用实例的方法。
  • 生命周期钩子的变化: Vue 3 对生命周期钩子的命名和调用顺序进行了调整。
  • 模板语法的变化: Vue 3 对模板语法进行了一些微调,以更好地支持 Composition API。

总的来说,Vue 3 在性能、灵活性、类型支持和开发体验方面都有显著的改进。然而,这些改进也意味着从 Vue 2 迁移到 Vue 3 可能需要一些时间和努力。 

vue2为什么监听不到数组内部的变化或者深层对象的变化?

在 Vue 2 中,由于其响应式系统的限制,监听数组内部的变化或深层对象的变化可能会遇到一些问题。以下是主要原因:

1. 数组变化检测

Vue 2 使用了 Object.defineProperty 来实现响应式系统。对于数组,Vue 2 通过拦截数组的变异方法(如 push、pop、shift、unshift、splice、sort、reverse)来触发视图更新。然而,这种机制不能检测到数组内部元素的变化,比如通过索引直接修改数组元素或修改数组对象的属性。

2. 深层对象变化检测

Vue 2 的响应式系统只能检测到对象属性的添加或删除,以及属性的值的变化。对于深层对象,Vue 2 默认不会递归地处理对象属性的响应式。这意味着,如果你在组件的 data 选项中定义了一个深层对象,然后直接修改这个对象的内部属性,Vue 2 可能不会检测到这些变化,因此也不会触发视图更新。

解决方法

为了解决这些问题,Vue 2 提供了一些方法来手动触发视图更新:

  • 对于数组,可以使用 Vue.set 或 this.$set 方法来添加或修改数组元素。例如:

this.$set(this.array, index, newValue);

对于对象,可以使用 Vue.set 或 this.$set 方法来添加或修改对象的属性。例如:

this.$set(this.obj, 'newProp', newValue);

此外,Vue 2 还提供了 watch 选项,允许开发者手动监听数据的变化并执行相应的操作。

Vue 3 的改进

在 Vue 3 中,这些问题得到了解决。Vue 3 使用了 Proxy 作为其响应式系统的核心,这可以更灵活和高效地处理数组内部元素和深层对象属性的变化。因此,在 Vue 3 中,你通常不需要使用 Vue.set 或 this.$set 来手动触发视图更新,因为 Proxy 可以自动检测到这些变化。

### Vue3重置表单数据方法Vue3 Element Plus 组合使用的场景下,`el-form` 的 `resetFields()` 方法用于清除表单中的输入并移除验证错误提示。然而,在某些情况下该方法可能不会按预期工作,这通常是因为组件的状态管理或生命周期钩子处理不当[^1]。 对于更可靠的解决方案,推荐采用组合式 API (Composition API),这是 Vue3 推崇的方式之一。通过定义响应式的表单对象,并利用 JavaScript 原生的对象操作来实现表单的初始化与重置功能: ```javascript import { reactive } from &#39;vue&#39;; // 定义初始表单状态 const initialFormData = { name: &#39;&#39;, sex: 1, mobile: null, age: undefined, type: &#39;&#39; }; let formData = reactive({ ...initialFormData }); function resetForm() { // 使用扩展运算符复制默认值到当前表单状态 Object.assign(formData, { ...initialFormData }); } ``` 当需要调用此函数时——比如点击对话框内的取消按钮或是提交成功后想要清空表单的时候,只需简单地执行 `resetForm()` 即可恢复至原始状态[^2]。 另外需要注意的是,如果希望同时清理掉所有的校验信息,则应该确保已经给 `<el-form>` 设置了一个 ref 属性以便能够访问其实例上的 `resetFields` 方法: ```html <template> <el-dialog :visible.sync="dialogVisible"> <!-- 表单 --> <el-form ref="ruleFormRef" :model="formData"> ... </el-form> <!-- 取消按钮 --> <button @click="handleCancel">取消</button> </el-dialog> </template> <script setup> import { ref } from "vue"; const ruleFormRef = ref(null); async function handleCancel() { await ruleFormRef.value.resetFields(); resetForm(); } // 上述提到过的 resetForm 函数... </script> ``` 上述代码片段展示了如何结合 Composition API 来创建一个可以被轻松重置数据模型以及怎样触发表单及其关联字段的有效性检查重置过程[^3]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零凌林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值