Skip to content

composables 与 useState

composables

自动扫描

此目录下的所有顶层文件会被自动扫描,文件中导出的方法,在应用程序中可以被直接使用,不用再手动引入

bash
├── composables
   ├── useDate.js
  • 使用
ts
export const UsegetYear = () => {
  return new Date().getFullYear();
};
  • 调用
html
<template>
  <div>{{ year }}</div>
</template>
<script setup>
  const year = UsegetYear();
</script>

嵌套扫描

bash
├── composables
   ├── auth
   ├── useDate.js
  • 使用

在 nuxt.config.ts 里面

ts
// 嵌套寻找composables
imports: {
    dirs: [
        // 扫描顶层模块
        'composables',
        // 扫描嵌套的模块,并且使用特定的名称和后缀的文件
        'composables/*/index.{ts,js,mjs,mts}',
        // 扫描给定目录内的所有模块
        'composables/**'
    ]
},

useState

Nuxt3 提供了可组合的 useState,以创建跨组件和 SSR 友好的共享数据状态,

利用此特性也可实现全局的状态管理(客户端不是可以持久化)

不能刷新页面,只能用跳转的方式

简单使用

在单个路由中使用的时候类似于 ref 的功能

创建的值可以作为全局的唯一标识,在任何其他的路由组件中使用

html
<template>
  <div>
    <div>useState 里面的内容 {{ countnumber }}</div>
    <button @click="changecountnumber">+1</button>
    <button @click="gotologin">跳转到登录页</button>
  </div>
</template>
<script setup>
  const countnumber = useState("countnumber", () => 0);
  const changecountnumber = () => {
    countnumber.value++;
  };
  const Router = useRouter();
  const gotologin = () => {
    Router.push("/login");
  };
</script>
  • login 页面
html
<template>
  <div>
    变化的值{{ countnumber }}
    <button @click="gotologin">跳转到首页</button>
  </div>
</template>
<script setup lang="ts">
  const countnumber = useState("countnumber");
  const Router = useRouter();
  const gotologin = () => {
    Router.push("/");
  };
</script>

配合 composables 使用

新建目录结构如下

bash
├── composables
   ├── auth
   ├── useStore.js

useStore.js

ts
export const useUserInfo = () => {
  return useState(() => {
    return {
      name: "jsopy",
      age: 18,
    };
  });
};

在页面中使用

  • index.vue
html
<!--
 * @Author: jsopy
 * @Date: 2024-12-08 10:19:02
 * @LastEditTime: 2024-12-08 15:29:36
 * @FilePath: /demo1/pages/index.vue
 * @Description:
 *
-->
<template>
  <div>
    <div>useState 里面的内容{{ userInfo.name }}---年龄{{ userInfo.age }}</div>
    <button @click="changecountnumber">改变名称</button>
    <button @click="gotologin">跳转到登录页</button>
  </div>
</template>

<script setup lang="ts">
  const userInfo = useUserInfo();
  const changecountnumber = () => {
    userInfo.value.name = "测试中";
    userInfo.value.age = 56;
  };
  const Router = useRouter();
  const gotologin = () => {
    Router.push("/login");
  };
</script>

<style scoped lang="scss">
  div {
    color: $blue;
  }
</style>
  • login.vue
html
<template>
  <div>
    <div>useState 里面的内容{{ userInfo.name }}---年龄{{ userInfo.age }}</div>
    <button @click="gotologin">跳转到首页</button>
  </div>
</template>

<script setup lang="ts">
  // 初始化方法
  const init = () => {
    definePageMeta({
      layout: "login",
    });
    // 局部改变
    const title = "首页测试结果";
    useHead({
      title,
      meta: [{ name: "description", content: "My amazing site." }],
    });
  };
  init();

  const userInfo = useUserInfo();
  const Router = useRouter();
  const gotologin = () => {
    Router.push("/");
  };
</script>

<style scoped></style>