Skip to content
On this page

存储状态数据 ​

组件库内置状态存储, 用于存储一些可以提升用户体验的的数据, 例如表格调整后的列宽信息, 自定义的显示列信息等等. 默认情况下组件不会使用状态存储.

状态存储的数据是以 storageKey 属性作为键名存储的, 因此如果组件没有设置 storageKey 属性, 则无法使用状态存储.

当组件的 storageKey 属性不为空时会开启状态存储.

注意

storageKey 属性的值必须是唯一的, 否则会导致数据冲突.

禁用状态存储 ​

对于某些本身就使用了 storageKey 属性的组件, 如果不希望启用状态存储, 可以通过设置 disabled-storable 属性来禁用状态存储.

html
<Component disabled-storable />

保存/恢复状态数据 ​

组件库提供 StorageManager 类来管理状态数据, 通过 recovery/toString 可以恢复/保存状态数据.

保存状态数据 ​

状态数据可以在 页面卸载 (beforeunload) 或用户登出前保存.

toString 接口返回的数据可以存储在本地(例如 localStorage), 也可以通过 http 接口发送到服务器存储.

javascript
import { StorageManager } from "@nbicc/common-components";

// 保存状态存储的数据, 可以在页面卸载或用户登出前保存.
window.addEventListener("beforeunload", () => {
  const storagedData = StorageManager.toString();
  localStorage.setItem("__KEY__", storagedData);
});
恢复状态数据 ​

状态数据可以在 页面加载 (load) 或用户登录后恢复.

javascript
// 恢复状态存储的数据, 可以在页面加载或用户登录后恢复.
const storagedData = localStorage.getItem("__KEY__");
StorageManager.recovery(storagedData);

状态存储可用的组件 ​

组件支持存储的数据说明
Table列宽调整列宽时会自动记录列宽
Toolbar表格列设置窗口中的列宽/固定方向/是否隐藏

示例 ​

html
<template>
  <NPageLayout>
    <template #header>
      <NEasyForm
        v-model:data="searchForm.data"
        :fields="fields"
        @search="searchForm.search"
        @reset="searchForm.search"
      ></NEasyForm>
    </template>
    <template #content>
      <NToolbar
        storage-key="storage-example-toolbar"
        v-model:table-columns="columns"
        :disabled-column-keys="['id', 'operator']"
        :export-as-file="() => requestPosts(1, 1, 1000)"
      >
        <NButton type="primary">按钮</NButton>
        <template #secondary>
          <NButton type="primary" @click="() => requestPosts(1, 1, 1000)">
            按钮
            <template #icon>
              <FilterOutlined />
            </template>
          </NButton>
          <NButton type="primary" danger>按钮</NButton>
          <NButton type="primary" ghost>按钮</NButton>
        </template>
      </NToolbar>

      <NEasyTable
        storage-key="storage-example-easy-table"
        :table-helper="tableHelper"
        :columns="columns"
        :row-selection="rowSelection"
        :column-config="{ resizable: true }"
        @change="onChange"
      />
    </template>
  </NPageLayout>
</template>
javascript
import { ref } from "vue";
import { FilterOutlined } from "@ant-design/icons-vue";
import { useAntDesignVueTableHelper, FormItemControlType } from "@nbicc/common-components";
import { requestPosts } from "../mock";

// 初始化 table helper
const { tableHelper, columns, onChange, rowSelection, searchForm } = useAntDesignVueTableHelper(
  requestDataSource,
  [
    {
      title: "Id",
      dataIndex: "id",
      fixed: "left",
      ellipsis: true
    },
    { title: "Name", dataIndex: "name", sorter: true, ellipsis: true },
    { title: "Author", dataIndex: "author", ellipsis: true },
    { title: "Title", dataIndex: "title", ellipsis: true },
    {
      title: "Description",
      dataIndex: "description",
      ellipsis: true
    },
    { title: "Level", dataIndex: "level", ellipsis: true },
    { title: "Created At", dataIndex: "createdAt", ellipsis: true },
    { title: "Updated At", dataIndex: "updatedAt", ellipsis: true },
    {
      title: "Operator",
      dataIndex: "operator",
      ellipsis: true
    }
  ],
  "id"
);

const fields = ref([
  { name: "input", label: "输入框输入框输入框输入框", type: FormItemControlType.INPUT },
  { name: "input-number", label: "数字输入框", type: FormItemControlType.INPUT_NUMBER },
  [
    { name: "select", label: "下拉框", type: FormItemControlType.SELECT },
    {
      options: [
        {
          label: "option1",
          value: "option1"
        },
        { label: "option2", value: "option2" },
        { label: "option3", value: "option3" }
      ]
    }
  ],
  { name: "date-picker", label: "日期选择器", type: FormItemControlType.DATE_PICKER },
  { name: "time-picker", label: "时间选择器", type: FormItemControlType.TIME_PICKER },
  { name: "switch", label: "开关", type: FormItemControlType.SWITCH },
  [
    { name: "radio", label: "单选框", type: FormItemControlType.RADIO_GROUP },
    {
      options: [
        {
          label: "option1",
          value: "option1"
        },
        { label: "option2", value: "option2" },
        { label: "option3", value: "option3" }
      ]
    }
  ],
  [
    { name: "checkbox", label: "多选框", type: FormItemControlType.CHECKBOX_GROUP },
    {
      options: [
        {
          label: "option1",
          value: "option1"
        },
        { label: "option2", value: "option2" },
        { label: "option3", value: "option3" }
      ]
    }
  ],
  { name: "textarea", label: "文本域", type: FormItemControlType.TEXT_AREA },
  { name: "slider", label: "滑块", type: FormItemControlType.SLIDER },
  { name: "tree-select", label: "树选择器", type: FormItemControlType.TREE_SELECT },
  { name: "cascader", label: "级联选择器", type: FormItemControlType.CASCADER }
  // { name: "custom", label: "自定义", type: FormItemControlType.CUSTOM }
]);

// 立即加载数据
tableHelper.loadRecord(true);

// 模拟请求
function requestDataSource(pagination, filter, sorter) {
  console.info("分页参数: ", pagination);
  console.info("查询参数: ", filter);
  console.info("排序参数: ", sorter);
  const { current, pageSize } = pagination;
  return requestPosts(current, pageSize, 1000);
  // 测试空数据
  // return { data: [], total: 0 };
}