请教一个 vue3 中 ref 的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sunmoon1983
V2EX    Vue.js

请教一个 vue3 中 ref 的问题

  •  
  •   sunmoon1983 2022-04-30 08:52:55 +08:00 3195 次点击
    这是一个创建于 1323 天前的主题,其中的信息能已经有所发展或是发生改变。

    我有一个自定义的数据类型

    export interface ICategoryFormData { id: number; cate_name: string; parent_id: number; } 

    在页面中有一个变量formData

    import { ref } from 'vue'; const formData = ref(); 

    再我在我想给 formData 一个ICategoryFormData类型的默认值应该怎么做? 能想到的一个方法就是这样

    const data :ICategoryFormData={ id:0, cate_name:'', parent_id:0, } const formData = ref<ICategoryFormData>(data); 

    现在问题来了,我不想每次都初始化一个data变量,如果ICategoryFormData中字段特别多,那么我就要手写很多,很多,所以我想问下,有没有什么更简洁的方法不用初始化ICategoryFormData就能给定formData 一个默认值呢?

    14 条回复    2022-08-28 15:07:20 +08:00
    noe132
        1
    noe132  
       2022-04-30 09:04:46 +08:00 via Android
    const categoryFormDataRef = (data = {
    id:0,
    cate_name:'',
    parent_id:0,
    }) => ref(data)

    const formData = categoryFormDataRef()
    sunmoon1983
        2
    sunmoon1983  
    OP
       2022-04-30 10:12:52 +08:00
    @noe132 你这还查初始化呀!每个字段都要赋一遍值
    shakukansp
        3
    shakukansp  
       2022-04-30 11:04:01 +08:00
    ts 并不能对运行时造成影响
    你去掉 ts 怎么给它默认值,加上 ts 就还是怎么给,只是多了类型
    doommm
        4
    doommm  
       2022-04-30 11:08:23 +08:00
    没太懂。写一个工厂函数,返回一个 ICategoryFormData 类型的默认值,然后用到的地方调用一下就行了?或者写一个实现 ICategoryFormData 接口的 class ,但本质上是一样的,初始化的值需要你至少手写一次
    Bingchunmoli
        5
    Bingchunmoli  
       2022-04-30 11:09:46 +08:00 via Android
    声明 interface 然后 export
    wleven
        6
    wleven  
       2022-04-30 11:10:33 +08:00
    const formData = ref<ICategoryFormData | undefined>()
    调用的时候用可选链 formData?.id
    thinkershare
        7
    thinkershare  
       2022-04-30 11:35:41 +08:00
    编译器没有获取足够的信息, 并不知道自动给你填充足够的类型.
    实在想跳过去可以这么做: ref({} as unknow as ICategoryFormData)
    molvqingtai
        8
    molvqingtai  
       2022-04-30 12:30:34 +08:00 via Android   1
    as
    codingguy
        9
    codingguy  
       2022-04-30 14:57:40 +08:00
    const formData = ref<Partial<ICategoryFormData>>({ })
    提交时候
    const values = formData.value as ICategoryFormData
    7gugu
        10
    7gugu  
       2022-04-30 20:53:43 +08:00 via iPhone
    用 partial 套一下?
    tedding
        11
    tedding  
       2022-05-01 00:36:46 +08:00 via iPhone
    typescript 建议 不要在 interface 命名使用前缀 I ,对于 ICategoryFormData 可以 声明一个 class 代替,用的时候 实例化这个 class 来初始化你需要赋值的变量。class 可以 代替 interface 表示 变量的类型 使用。
    Biwood
        12
    Biwood  
       2022-05-01 13:38:12 +08:00 via Android
    写类型的同时写一个常量用于保存默认值,如

    export const DEFAULT_CATEGORY_DATA: ICategoryFormData = {
    ...
    }

    使用的时候直接 import 过来,用展开符或者 cloneDeep 函数复制一份即可

    const formData = ref<ICategoryFormData>({ ...DEFAULT_CATEGORY_DATA })

    可以不用每次都写一遍
    td width="10" valign="top">
    Zzzz77
        13
    Zzzz77  
       2022-05-01 18:08:18 +08:00
    定义类型的时候 export 一个默认值出去,其他地方都 import 它就好了啊,再怎么样肯定也要手写一次呀
    chenjiangui998
        14
    chenjiangui998  
       2022-08-28 15:07:20 +08:00
    直接
    ```
    const formData = ref<ICategoryFormData>(); // 实际是可选类型, 编译也是可选类型

    const formData = ref({} as ICategoryFormData); //实际是可选的, 编译是 ICategoryFormData
    ```
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2651 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 14:32 PVG 22:32 LAX 06:32 JFK 09:32
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86