vue3 + setup + ts 简单的使用记录

1、setup 定义双向绑定变量,使用 ref 和 reactive , 并 return 回去,就可以在模板使用

import { defineComponent, ref, reactive } from 'vue';

export default defineComponent({
  name: 'about',
  setup() {
    const msg = ref('This is an about page');
    const obj = reactive({
      a: 1,
      b: 2
    })

    return {
      msg,
      obj
    }
  },
})

2、setup 改动 msg 和 obj, toRefs的使用

import { defineComponent, ref, reactive, toRefs } from 'vue';

export default defineComponent({
  name: 'about',
  setup() {
    const msg = ref('This is an about page');
    const obj = reactive({
      a: 1,
      b: 2
    })

    const msgValue = ()=>{
      msg.value = 'value'; // 使用 ref 定义的 要加 .value 就可以改动
      obj.a = 2;  // reactive 定义的对象不须要
    }

    return {
      msg,
      obj,
      ...toRefs(obj), // toRefs 解构出里面每个值,模板里直接用 {{b}},
      msgValue
    }
  },
})

3、 setup 使用勾子函数,引入后直接调用,以下是 onMounted 和 nextTick 的使用,其它也是一样的

import { defineComponent, onMounted, nextTick } from "vue";

export default defineComponent({
  setup(props, context) {
    onMounted(() => {
      console.log(context);
    });
    nextTick(() => {
      console.log(context);
    });
  },
});

4、子组件的使用:接收参与调用父组件, defineComponent 格式

//  父组件 使用子组件 testCom , 传参与传进一个回调
<template>
  <div class="about">
    <h1>{{ obj }}</h1>
    <test-com :msg="msg" @change="msgValue"></test-com>
  </div>
</template>



// 子组件使用

<template>
  <div>
    <h1 @click="testClick">{{ msg }}</h1>
  </div>
</template>

<script lang="ts">
import { defineComponent } from "vue";

export default defineComponent({
  props: {
    msg: {  // 接收参数
      type: String,
      default: "",
    },
  },
  setup(props, context) {
    console.log(props.msg); // 使用参数
    const testClick = () => {
      context.emit("change"); // 使用回调方法
    };
    return {
      testClick,
    };
  },
});
</script>

4.1、子组件的使用:接收参与调用父组件, <script setup lang="ts"> 格式

<template>
  <div>
    <h1 @click="testClick">{{ msg }}</h1>
  </div>
</template>

<script setup lang="ts">
import { defineProps, ref, defineEmits } from "vue";

const props = defineProps({
  // defineProps 接收参数
  msg: {
    type: String,
    default: "",
  },
  // ... 多个向后加
});

const emit = defineEmits(["change"]); // 定义 emit 有哪个回调方法,多个向后加 defineEmits(["change","click",...])
const testClick = () => {
  console.log(props.msg); // 使用父级传进来的参数
  emit("change");
};
</script>

5、父组件调用子组件 testCom

<template>
  <div class="about">
    <h1 @click="childClick">点击</h1>
    <test-com ref="testCom" :msg="msg" @change="msgValue"></test-com>
  </div>
</template>
<script lang="ts">
import { defineComponent, ref, reactive } from "vue";
import testCom from "./components/test-com.vue";
export default defineComponent({
  components: {
    "test-com": testCom,
  },
  name: "about",
  setup() {

    const testCom: any = ref<null | HTMLElement>(null); // 获取名字为 testCom 的组件,名字要和 标签上的 ref 名字相同
    const childClick = () => {
      testCom.value.testClick(); //  调用子组件的方法 testClick
    };

    return {
      testCom,   // 一定要return 回去才管用,不然 testCom.value 是找不到这个组件的
      childClick,
    };
  },
});
</script>

6、setup 使用 “router” 、 “vuex” 、“watch”

<script lang="ts">
import { defineComponent } from "vue";
import { useStore } from "vuex"; // 引入 vuex 
import { useRouter, useRoute } from "vue-router"; // 引入路由

export default defineComponent({

  setup() {

    const router = useRouter(); //路由跳转等信息 相当于 $router
    const route = useRoute(); // $route

    const store = useStore();
    store.commit("SET_ISLOGIN", false); // 调用 vuex 方法
    const state = store.state; // 使用 state 数据

    watch(route, (newval,old) => { // 监听路由
      console.log(newval);
      console.log(old);
    });

    return {

    };
  },
});
</script>

7、向 vue 中添加全局变量用 app.config.globalProperties.xx, 示例中添加 config 、 common和注册全局组件

import { createApp } from "vue";
import App from "./App.vue";
import router from "./router";
import ElementPlus from "element-plus";
import "element-plus/dist/index.css";
import store from "./store";
import config from "./config/config";
import common from "./common/common";
import mainContent from "./components/main-content/main-content.vue";

const app = createApp(App);
app.config.globalProperties.$config = config;   // 添加全局变量 config
app.config.globalProperties.$common = common;   // 添加全局就是 common
app.use(store).use(ElementPlus).use(router).mount("#app");

app.component("pi-main-content", mainContent); // 注册全局组件

8、 setup 使用全局变量

setup() {
 const internalInstance = getCurrentInstance();
    const globalProperties =
      internalInstance?.appContext.config.globalProperties;
    console.log(globalProperties);
}

好长的一段,可以把它写的一个方法,调用就不用写这么多了

// 起一个文件  useCurrentInstance.ts , 写上以下方法


import { ComponentInternalInstance, getCurrentInstance } from "vue";
export default function useCurrentInstance() {
  const { appContext } = getCurrentInstance() as ComponentInternalInstance;
  const globalProperties = appContext.config.globalProperties;
  return {
    globalProperties,
  };
}






//组件里使用

import useCurrentInstance from "../../hooks/useCurrentInstance"; // 引入
const { globalProperties } = useCurrentInstance();

console.log(globalProperties); // 得到所有的全局变量
console.log(globalProperties.$touter); // 使用路由

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值