vue3+ts优雅的定义setup中的属性(附用户代码片段)

1.解决Vue3中使用reactive定义的响应式失效

2.统一管理组件数据

3.重置组件setup中的数据

示例:

<template>
  <div class='demo'>
    <div>{{ str }}</div>
    <div><button @click="add">str++</button></div>
    <div><button @click="reset">重置属性</button></div>
  </div>
</template>

<script lang='ts'>
interface demo {
  str: string;
  add: () => void;
  reset: () => void;
}
import { reactive, toRefs, onBeforeMount, onMounted, getCurrentInstance, defineComponent, ComponentInternalInstance, ToRefs } from 'vue';
export default defineComponent({
  name: 'demo',
  props: [],
  setup() {
    const ctx: ComponentInternalInstance | null = getCurrentInstance();
    console.log(ctx);
    console.log('1-开始创建组件-setup');
    onBeforeMount(() => {
      console.log('2.组件挂载页面之前执行----onBeforeMount');
    });
    onMounted(() => {
      console.log('3.-组件挂载到页面之后执行-------onMounted');
    });
    const initState = (): demo => {
      return {
        str: "1",
        add: () => {
          model.str += '-';
        },
        reset: () => {
          resetState();
        }
      };
    };
    let model: demo = reactive(initState());
    let data: ToRefs<demo> = toRefs(model);
    let resetState = (): void => {
      Object.assign(model, initState()); // 将新状态对象的属性分配到现有响应式对象
    };
    return {
      ...data,
      resetState
    };
  }
});
</script>
<style lang='stylus' scoped>
</style>

VsCode用户代码片段如下:

{
  "Print to console": {
      "prefix": "vue3-ts",
      "body": [
          "<template>",
          "  <div class='$TM_FILENAME_BASE'></div>",
          "</template>",
          "",
          "<script lang='ts'>",
          "interface $TM_FILENAME_BASE {",
          "}",
          "import { reactive,toRefs,onBeforeMount,onMounted, getCurrentInstance,defineComponent,ComponentInternalInstance,ToRefs} from 'vue'",

          "export default defineComponent({",
          "   name: '$TM_FILENAME_BASE',",
          "   props: [],",
          "   setup() {",
          "     const ctx:ComponentInternalInstance | null = getCurrentInstance()",
          "     console.log(ctx)",
          "     console.log('1-开始创建组件-setup')",

          "     onBeforeMount(() => {",
          "        console.log('2.组件挂载页面之前执行----onBeforeMount')",
          "     })",
          "     onMounted(() => {",
          "       console.log('3.-组件挂载到页面之后执行-------onMounted')",
          "     })",
          "     const initState = (): $TM_FILENAME_BASE => {",
          "       return {",
          "       };",
          "     };",
          "     const model:$TM_FILENAME_BASE = reactive(initState());",
          "     let data: ToRefs<$TM_FILENAME_BASE> = toRefs(model);",
          "     let resetState = (): void => {",
          "      Object.assign(model, initState()); // 将新状态对象的属性分配到现有响应式对象",
          "     }",
          "     return {",
          "       ...data,",
          "       resetState",
          "      }",
          "   }",
          "})",
          "</script>",
          "<style lang='stylus' scoped>",
          "</style>",
  ],
      "description": "Log output to console"
  }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值