本篇主要记录两个问题,然而这两个问题又都可以对应同一种解法。废话少说,解决方法在最上面。推荐格式如下:

const form = reactive({
    formData: {//为了保证响应性,一定一定要多包这一层
      key1: value,
      key2: value,
    },
  });
//或 个人比较喜欢第一种,大家各自取用吧
const form = ref({
   key1: value,
   key2: value,
});

一定一定要再多包一层,不然就会遇到一些问题。(⊙﹏⊙)虽然这是一句废话。下面的内容过于基础且本篇只记录bug和解法,想要探求为什么的呢,还请自己去查API。不愿浪费时间的,看到这里就结束了。

做项目一般都用个UI框架,我这次用的是字节的Arco Design,vue是3.2版本的。我一开始写了个表单,数据是这样式定义的

<template>
    <a-input v-model="obj.k1" placeholder="请填写测试" />
    <input v-model="obj.k2" placeholder="请填写测试值" />
</template>
<script setup>
    //表单数据
    let obj = reactive({ k1: undefined, k2: undefined });
    //本地记录或后台获取的表单数据
    const text = { k1: '测试', k2: 'abcd' };
    /*
     * 第一次解决视图不更新
     * const text = reactive({ k1: '测试', k2: 'abcd' });
    */
    //获取到表单数据后赋值给表单
    obj = text;
</script>

然后,第一次出现数据编辑,视图不更新。

这个我想那就强制刷新下视图吧,然后我就"$forceUpdate()",然后就出乎意料的失败了,那我再想想吧,后来我尝试这在获取的数据前加了个reactive,然后我就沿着错误的道路,继续往下走,直到遇到了第二个bug。

再说第二个bug前,插句话,此时原生的input还可以视图响应数据。因此,我标题加上了UI框架。

第二个视图不更新是在清空表单的时候遇到的。就是一旦给定初始值,我在清空表单时将对象置空,就又不好使了。

这次我的解决方法更直接了。直接点属性赋值。

<template>
    <a-input v-model="obj.k1" placeholder="请填写测试" />
    <input v-model="obj.k2" placeholder="请填写测试值" />
    <a-button type="primary" status="danger" @click="a">清空数据</a-button>
</template>
<script setup>
    //表单数据
    let obj = reactive({ k1: undefined, k2: undefined });
    //本地记录或后台获取的表单数据
     const text = reactive({ k1: '测试', k2: 'abcd' });
    //获取到表单数据后赋值给表单
    obj = text;
    //清空表单
    const a = () => {
        /*
        * 好使
        * 如果对象key值较多可以遍历对象,如采用for..in等循环
        */
        obj.k1 = undefined;
        obj.k2 = undefined;
        //不好使
        obj = {};
        //不好使
        obj = reactive({});
        //不好使
        obj = reactive({ k1: undefined, k2: undefined });
  };
</script>

虽然表单这样也算完成了。但是都写成这样了,还不知道自己写的有问题,那才有鬼了。

于是,我就又写了一遍。

<template>
    <a-input v-model="obj2.val.k1" placeholder="请填写测试" />
    <input v-model="obj2.val.k2" placeholder="请填写测试值" />
    <a-button type="primary" status="danger" @click="a">清空数据</a-button>
</template>
<script setup>
    const obj2 = reactive({
        val: {
            k1: undefined,
            k2: undefined,
        },
    });
    const text2 = { k1: '测试', k2: 'abcd' };
    obj2.val = text2;
    const a = () => {
        obj2.val = {};
    };
</script>

<template>
    <a-input v-model="obj2.k1" placeholder="请填写测试" />
    <input v-model="obj2.k2" placeholder="请填写测试值" />
    <a-button type="primary" status="danger" @click="a">清空数据</a-button>
</template>
<script setup>
  const obj2 = ref({
    k1: undefined,
    k2: undefined,
  });
  const text2 = { k1: '测试', k2: 'abcd' };
  obj2.value = text2;
  const a = () => {
    obj2.value = {};
  };
</script>

嗯嗯,很快就完成了。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐