1 Star 2 Fork 0

张超杰 / data-mapping

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

@dream2023/data-mapping

npm version npm bundle size npm downloads NPM

介绍

@dream2023/data-mapping 通过抽离并融合 vue 2 中的表达式解析能力,以及自身的数据映射能力,形成了小巧而功能完善的表达式和对象解析引擎。

特点

  • 体积小:源码 3Kb + 依赖 4Kb = 7Kb;
  • 能力强:支持深度对象、自定义分隔符、自定义过滤器等;
  • 稳定性高:测试覆盖率 100%。

快速上手

yarn add @dream2023/data-mapping # npm install -S @dream2023/data-mapping
import { compilerStr, dataMapping } from '@dream2023/data-mapping';

compilerStr('{{name}}', { name: 'jack' }); // "jack"

dataMapping(
  { username: '{{ info.name }}', address: '{{ address }}' },
  { info: { name: '夏洛克福尔摩斯' }, address: '伦敦贝克街221号' }
); // { username: '夏洛克福尔摩斯', address: '伦敦贝克街221号' }

功能详解

模板字符串

compilerStr('{{name}}', { name: 'jack' }); // "jack"

compilerStr 接受两个参数,第一个参数为需要编译的字符串模板,第二个参数为数据对象,字符串模板会根据数据对象编译出相应的结果。

compilerStr('{{firstName}} -- {{lastName}}', {
  firstName: 'jack',
  lastName: 'li'
}); // "jack --- li"

它不仅可以作为单个变量的取值,还可以是多个变量组成的字符串。

表达式

compilerStr("{{ok ? 'YES' : 'NO'}}", { ok: true }); // "YES"

compilerStr("{{message.split('').reverse().join('')}}", {
  message: 'are you ok?'
}); // "?ko uoy era"

不仅可以取值,内部还可以使用表达式。

支持链式取值

compilerStr(
  'My name is {{name}}. I live in {{address.area}}, {{address.city}}',
  {
    name: 'jack',
    address: {
      city: 'Shenzhen',
      area: 'Nanshan'
    }
  }
);

对象数据映射

@dream2023/data-mapping 不仅提供了对字符串的编译,还提供了对对象的编译。

dataMapping(
  { username: '{{name}}', password: '{{pwd}}' },
  { name: 'jack', pwd: 'helloworld' }
); // { username: 'jack', password: 'helloworld' }

当然,其也是支持深度嵌套,以及上述 compilerStr 所有特性。

// 支持函数
dataMapping(
  {
    country(data: any) {
      return data.address.split('-')[0];
    },
    province(data: any) {
      return data.address.split('-')[1];
    }
  },
  { address: 'china-guangzhou' }
); // { country: 'china', province: 'guangzhou' }

过滤器

过滤器是对数据映射的一种增强,它的作用是对获取数据做一些处理,其用法同 vue2 中的过滤器

{{ message | filterA | filterB }}

自定义过滤器

import { setFilter, setFilters, clearFilters } from '@dream2023/data-mapping';

// 实现一个函数
const capitalize = (value) => {
  if (!value) return '';
  value = value.toString();
  return value.charAt(0).toUpperCase() + value.slice(1);
};

// 设置单个过滤器
setFilter('capitalize', capitalize);

// 设置多个过滤器
setFilters({ capitalize });

// 使用
compilerStr('{{ message | capitalize }}', { message: 'hello' }); // Hello

// 如果不想用过滤器,也可以清除
clearFilters();

分隔符

如果你觉得默认的分隔符不符合你的习惯,可以更改分隔符,具体如下:

import {
  compilerStr,
  setDelimiters,
  clearDelimiters
} from '@dream2023/data-mapping';

// 设置分隔符
setDelimiters(['${', '}']);

// 使用
compilerStr('My Name is ${name}', { name: 'Jack' });

// 当然,设置后也可以清除
clearDelimiters();

因为是全局设置,会影响上述 DEMO,所以这里就不做演示了。

$ 符便捷展开对象

我们首先看下面示例,我们需要将 longitudelatitudeloc 字段中抽离到上一层级,我们就需要下面这样写 👇:

dataMapping(
  {
    name: '{{name}}',
    longitude: '{{loc.longitude}}',
    latitude: '{{loc.latitude}}'
  },
  {
    name: 'jack',
    loc: { longitude: 118.366899, latitude: 40.90281 }
  }
); // {  name: 'jack', longitude: 118.366899, latitude: 40.90281 }

其实两个字段还好,如果属性非常多的时候就比较麻烦,此时我们可以通过 $ 便捷的实现展开:

dataMapping(
  {
    name: '{{name}}',
    $: '{{loc}}'
  },
  {
    name: 'jack',
    loc: { longitude: 118.366899, latitude: 40.90281 }
  }
); // {  name: 'jack', longitude: 118.366899, latitude: 40.90281 }

相关链接

MIT License Copyright (c) 2019 二当家的 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.m

简介

@dream2023/data-mapping is a perfect object mapping solution。 展开 收起
TypeScript 等 2 种语言
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
TypeScript
1
https://gitee.com/dream2023/data-mapping.git
git@gitee.com:dream2023/data-mapping.git
dream2023
data-mapping
data-mapping
main

搜索帮助