Lodash库

Lodash 是一个一致性、模块化、高性能的 JavaScript 实用工具库。

网址:https://www.lodashjs.com/

下载及引用

  1. npm i --save lodash
  2. import _ from 'lodash'

常用的api

  1. 1. _.isNil(value): (boolean): 如果 value null undefined,那么返回 true,否则返回 false.
  2. 2. _.size(collection): 返回collection(集合)的长度,如果集合是类数组或字符串,返回其 length ;如果集合是对象,返回其可枚举属性的个数.
  3. 3. _.isEqual(value, other): (boolean): 如果 两个值完全相同,那么返回 true,否则返回 false.
  4. 4. _.get(object, path, [defaultValue]): 根据 object对象的path路径获取值。 如果解析 value undefined 会以 defaultValue 取代.
  5. var object = { 'a': [{ 'b': { 'c': 3 } }] };
  6. _.get(object, 'a[0].b.c');
  7. // => 3
  8. _.get(object, ['a', '0', 'b', 'c']);
  9. // => 3
  10. _.get(object, 'a.b.c', 'default');
  11. // => 'default'
  12. 5. _.isNaN(value): (boolean): 如果 value 是一个 NaN,那么返回 true,否则返回 false.
  13. 6. _.cloneDeep(value): 它会递归拷贝 value。(注:也叫深拷贝).
  14. 7. _.isEmpty(value): 检查 value 是否为一个空对象,集合,映射或者set: (boolean): 如果 value 为空,那么返回 true,否则返回 false.
  15. 8. _.set(object, path, value): 设置 object对象中对应 path 属性路径上的值,如果path不存在,则创建.
  16. Note: 这个方法会改变 object.
  17. var object = { 'a': [{ 'b': { 'c': 3 } }] };
  18. _.set(object, 'a[0].b.c', 4);
  19. console.log(object.a[0].b.c);
  20. // => 4
  21. _.set(object, ['x', '0', 'y', 'z'], 5);
  22. console.log(object.x[0].y.z);
  23. // => 5
  24. 9. _.assign(object, [sources]): 分配来源对象的可枚举属性到目标对象上。 来源对象的应用规则是从左到右,随后的下一个对象的属性会覆盖上一个对象的属性.
  25. function Foo() {
  26. this.a = 1;
  27. }
  28. function Bar() {
  29. this.c = 3;
  30. }
  31. Foo.prototype.b = 2;
  32. Bar.prototype.d = 4;
  33. _.assign({ 'a': 0 }, new Foo, new Bar);
  34. // => { 'a': 1, 'c': 3 }
  35. 10. _.merge(object, [sources]): 该方法类似_.assign 除了它递归合并 sources 来源对象自身和继承的可枚举属性到 object 目标对象。如果目标值存在,被解析为undefinedsources 来源对象属性将被跳过.
  36. Note: 这方法会改变对象 object.
  37. var object = {
  38. 'a': [{ 'b': 2 }, { 'd': 4 }]
  39. }
  40. var other = {
  41. 'a': [{ 'c': 3 }, { 'e': 5 }]
  42. }
  43. _.merge(object, other);
  44. // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
  45. 11. _.debounce(func, [wait=0], [options=]): 创建一个 debounced(防抖动)函数,该函数会从上一次被调用后,延迟 wait 毫秒后调用 func 方法.
  46. 12. _.throttle(func, [wait=0], [options=]): 创建一个节流函数,在 wait 秒内最多执行 func 一次的函数。 该函数提供一个 cancel 方法取消延迟的函 数调用以及 flush 方法立即调用.
  47. 13. shuffle 使用 FisherYates洗牌算法创建一个随机数组。
  48. import shuffle from 'lodash/shuffle';
  49. const result = shuffle([1, 2, 3, 4, 5]);
  50. // result => [2, 5, 1, 4, 3]
  51. 14.orderBy 创建一个数组,按指定顺序排序。
  52. const items = [
  53. { name: 'Item A', price: 2 },
  54. { name: 'Item B', price: 8 },
  55. { name: 'Item C', price: 4 },
  56. { name: 'Item D', price: 4 }
  57. ];
  58. const result = orderBy(items, ['price', 'name'], ['desc', 'asc']);
  59. /*
  60. result => [
  61. { name: 'Item B', price: 8 },
  62. { name: 'Item C', price: 4 },
  63. { name: 'Item D', price: 4 },
  64. { name: 'Item A', price: 2 }
  65. ]
  66. 15. difference 创建不包含在其他给定数组的元素的数组。结果数组元素的顺序由第一个数组决定。
  67. const result = difference([1, 2, 3], [2, 3, 4]);
  68. // result => [1]
  69. 16. _.uniqueId([prefix='']) 生成唯一ID。 如果提供了 prefix ,会被添加到ID前缀上.
  70. _.uniqueId('contact_');
  71. // => 'contact_104'
  72. _.uniqueId();
  73. // => '105'

classnames库

在react开发中,我们有的时候需要使用js来动态判断是否为组件添加class(类名),这里我们使用到了classnames.

网址:https://www.npmjs.com/package/classnames

下载及引用

  1. npm install classnames --save
  2. import classnames from 'classnames'

由于react原生动态添加多个className会报错

  1. import style from './style.css'
  2. <div className={style.class1 style.class2}</div>

想要得到最终渲染的效果是:

  1. <div class='class1 class2'></div>

使用

  1. import classnames from 'classnames'
  2. <div className=classnames({
  3. 'class1': true,
  4. 'class2': true
  5. })>
  6. </div>
  1. 其他用法:
  2. classNames('foo', 'bar'); // => 'foo bar'
  3. classNames('foo', { bar: true }); // => 'foo bar'
  4. classNames({ 'foo-bar': true }); // => 'foo-bar'
  5. classNames({ 'foo-bar': false }); // => ''
  6. classNames({ foo: true }, { bar: true }); // => 'foo bar'
  7. classNames({ foo: true, bar: true }); // => 'foo bar'
  8. // lots of arguments of various types
  9. classNames('foo', { bar: true, duck: false }, 'baz', { quux: true }); // => 'foo bar baz quux'
  10. // other falsy values are just ignored
  11. classNames(null, false, 'bar', undefined, 0, 1, { baz: null }, ''); // => 'bar 1'

传入数组对象:

  1. var arr = ['b', { c: true, d: false }];
  2. classNames('a', arr); // => 'a b c'

传入动态class

  1. let buttonType = 'primary';
  2. classNames({ [`btn-${buttonType}`]: true });
  3. classNames({ [`btn-${buttonType}`]: this.flag });
  4. classNames({ [styles.main ]: this.flag })
  5. classNames({
  6. [styles.tag]: true,
  7. [styles.red]: sentimentFlag === 1
  8. })
  9. ps: react中可以直接在classname内部传入动态class并进行条件判断

文件 图片转换为Base64格式

https://www.css-js.com/tools/base64.html

Moment.js

moment数据,时间戳,和常用时间的相互转换

1 、moment数据—>时间戳
valueOf()方法 同Date对象一样,如果获得的momen数据只需要调用valueOf即可
举例 let data= item.valueOf().
2、moment数据—>正常格式数据
用format()
举例:let data=moment(item).format(‘YYYY-MM-DD’).
3、时间戳—>moment数据
直接调用即可
举例: let data=moment(1568712361000).
4、时间戳—>正常格式数据
let data=moment(1568712361000).format(‘YYYY-MM-DD’).
5、正常数据格式->moment数据
let data=momet(‘2020-12-09’).
6、正常数据格式->时间戳
let data=momet(‘2020-12-09’).valueOf().
let data=new Data(2020,11,9).getTime().

Redux

中文文档: https://cn.redux.js.org/

下载依赖包

  1. npm install --save redux

redux 的核心 API

  1. 1.createStore()
  2. 作用:
  3. 创建包含指定 reducer store 对象
  4. 编码:
  5. import {createStore} from 'redux'
  6. import reducer from './reducer'
  7. const store = createStore(reducer)
  1. 2.store 对象
  2. 1) 作用:redux 库最核心的管理对象
  3. 2) 它内部维护着: state reducer
  4. 3) 核心方法: getState() dispatch(action) subscribe(listener)
  5. 4) 编码:
  6. store.getState()
  7. store.dispatch({type:'INCREMENT', number})
  8. store.subscribe(render)

富文本编辑器 braft-editor

下载:

  1. braft-editor 是一个基于 draftjs Web 富文本编辑器,适用于 React 框架,兼容主流现代浏览器。draft-js facebook 开源的一个富文本编译器,braft-editor draft-js 基础上进行了功能的拓展。
  2. npm install braft-editor --save
  1. import BraftEditor from 'braft-editor'
  2. import 'braft-editor/dist/index.css'
  3. export default function BraftEditorDemo(){
  4. const [ editorState , setEditorState ] = useState(null)
  5. const handleEditorChange = ()=>{ /* 富文本 */
  6. }
  7. return <div className="box" >
  8. <BraftEditor
  9. onChange={handleEditorChange}
  10. value={editorState}
  11. />
  12. </div>
  13. }
  14. BraftEditor 用起来还是很方便的, 支持全屏,拖拽上传 ,代码块 ,引用 等功能

二维码展示 qrcode.react

如果想在 React 项目中,使用链接生成二维码,可以尝试一下 qrcode.react

  1. import QRCode from 'qrcode.react'
  2. export default function Index(){
  3. return <div>
  4. <QRCode fgColor={'pink'} size={100} value="https://juejin.cn/user/2418581313687390" />
  5. <QRCode fgColor={'blue'} size={200} value="https://juejin.cn/user/2418581313687390" />
  6. <QRCode size={300} value="https://juejin.cn/user/2418581313687390" />
  7. </div>
  8. }

可视化图表 echarts-for-react

echarts-for-react 是使用 React 基于 echarts 封装的图表库,能够满足基本的可视化图表需求。把 echarts 的配置参数通过 React 组件的 props 形式进行传递配置.

参考官网:https://git.hust.cc/echarts-for-react/examples/simple

项目地址:https://github.com/hustcc/echarts-for-react

  1. npm install --save echarts-for-react
  2. import React from 'react';
  3. import ReactECharts from 'echarts-for-react';
  4. // or var ReactECharts = require('echarts-for-react');
  5. <ReactECharts
  6. option={this.getOption()}
  7. notMerge={true}
  8. lazyUpdate={true}
  9. theme={"theme_name"}
  10. onChartReady={this.onChartReadyCallback}
  11. onEvents={EventsDict}
  12. opts={}
  13. />
  14. // 组件的参数简介
  15. 1. option (required, object)
  16. 这个是核心,是必须的,包含echarts图表的配置项和数据,如标题title、图例legend、提示框tooltipxxAxisyyAxisseries
  17. 2. notMerge (optional, object)
  18. 可选,是否不跟之前设置的 option 进行合并,默认为 false,即合并。
  19. 3. lazyUpdate (optional, object)
  20. 可选,在设置完 option 后是否不立即更新图表,默认为 false,即立即更新
  21. 4. style (optional, object)
  22. 包含echarts图表的div的样式,默认是{height: '300px'}.
  23. 5. className (optional, string)
  24. 包含echarts图表的div的类名. 可以根据需要自行配置类名,不同类配置不同的css
  25. 6. theme (optional, string)
  26. 应用的主题。可以是一个主题的配置对象,也可以是使用已经通过 echarts.registerTheme 注册的主题名称
  27. (主题对象的格式样例: https://github.com/ecomfe/echarts/blob/master/theme/dark.js).
  28. 通过registerTheme注册主题:
  29. // import echarts
  30. import echarts from 'echarts';
  31. // register theme object
  32. echarts.registerTheme('my_theme', {
  33. backgroundColor: '#f4cccc'
  34. });
  35. ...
  36. // render the echarts use option `theme`
  37. <ReactEcharts
  38. option={this.getOption()}
  39. style={{height: '300px', width: '100%'}}
  40. className='echarts-for-echarts'
  41. theme='my_theme' />
  42. 7. onChartReady (optional, function)
  43. 当图表准备好时,将图表作为参数传给回调函数
  44. 8. loadingOption (optional, object)
  45. 9. showLoading (optional, bool, default: false)
  46. 是否加载动画效果
  47. 10. onEvents (optional, array(string=>function) )
  48. 为图表绑定事件
  49. let onEvents = {
  50. 'click': this.onChartClick,
  51. 'legendselectchanged': this.onChartLegendselectchanged
  52. }
  53. ...
  54. <ReactEcharts
  55. option={this.getOption()}
  56. style={{height: '300px', width: '100%'}}
  57. onEvents={onEvents} />

拖拽库 React dnd

React dnd 是 React 的一个推拽库,用起来还是比较得心应手的。

  • 参考官网:https://react-dnd.github.io/react-dnd/docs/overview
  • 项目地址:https://github.com/react-dnd/react-dnd

Day.js

一个极简的处理时间和日期的 JavaScript 库,和 Moment.js 的 API 设计保持一样, 但体积仅有2KB。

  1. npm install dayjs
  2. 复制代码

基本用法

  1. import dayjs from 'dayjs'
  2. dayjs().format('YYYY-MM-DD HH:mm') // => 2022-01-03 15:06
  3. dayjs('2022-1-3 15:06').toDate() // => Mon Jan 03 2022 15:06:00 GMT+0800 (中国标准时间)

API参考

  1. 当前时间
  2. dayjs()
  3. 时间字符串
  4. dayjs('2018-06-03')
  5. 时间戳
  6. dayjs(1528361259484)
  7. Date 对象
  8. dayjs(new Date(2018,8,18))
  9. 检测当前 Dayjs 对象是否是一个有效的时间
  10. dayjs().isValid()
  11. 获取
  12. dayjs().year()
  13. dayjs().month()
  14. dayjs().date()
  15. 星期 dayjs().day()
  16. dayjs().hour()
  17. dayjs().minute()
  18. dayjs().second()
  19. 毫秒 dayjs().millisecond()
  20. 设置
  21. dayjs().set('year',2017)
  22. dayjs().set('month',9)
  23. 增加时间并返回一个新的 Dayjs() 对象
  24. dayjs().add(7, 'day')
  25. dayjs().add(7, 'year')
  26. 减少时间并返回一个新的 Dayjs() 对象
  27. dayjs().subtract(7, 'year')
  28. dayjs().subtract(7, 'month')
  29. 返回当前时间的开头时间的 Dayjs() 对象,如月份的第一天。
  30. dayjs().startOf('year')
  31. dayjs().startOf('month')
  32. 返回当前时间的末尾时间的 Dayjs() 对象,如月份的最后一天。
  33. dayjs().endOf('month')
  34. dayjs().endOf('year')
  35. 格式化
  36. dayjs().format()
  37. dayjs().format('YYYY-MM-DD dddd HH:mm:ss.SSS A')
  38. 时间差
  39. dayjs('2018-06-08').diff(dayjs('2017-06-01'),'years')
  40. dayjs('2018-06-08').diff(dayjs('2017-06-01'),'day')
  41. dayjs('2018-06-08').diff(dayjs('2017-06-01'),'hour')
  42. Unix 时间戳 (毫秒)
  43. dayjs().valueOf()
  44. Unix 时间戳 (秒)
  45. dayjs().unix()
  46. 返回月份的天数
  47. dayjs().daysInMonth()
  48. 返回原生的 Date 对象
  49. dayjs().toDate()
  50. 返回包含时间数值的数组
  51. dayjs().toArray()
  52. 当序列化 Dayjs 对象时,会返回 ISO8601 格式的字符串
  53. dayjs().toJSON() //2018-06-08T02:44:30.599Z
  54. 返回 ISO8601 格式的字符串
  55. dayjs().toISOString() //2018-06-08T02:46:06.554Z
  56. 返回包含时间数值的对象
  57. dayjs().toObject()
  58. 字符串
  59. dayjs().toString()
  60. 检查一个 Dayjs 对象是否在另一个 Dayjs 对象时间之前
  61. dayjs('2018-06-01').isBefore(dayjs('2018-06-02'))
  62. 检查一个 Dayjs 对象是否和另一个 Dayjs 对象时间相同
  63. dayjs().isSame(dayjs())
  64. 检查一个 Dayjs 对象是否在另一个 Dayjs 对象时间之后
  65. dayjs().isAfter(dayjs())
Format Output Description
YY 18 两位数的年份
YYYY 2018 四位数的年份
M 1-12 月份,从 1 开始
MM 01-12 月份,两位数
MMM an-Dec 简写的月份名称
MMMM January-December 完整的月份名称
D 1-31 月份里的一天
DD 01-31 月份里的一天,两位数
d 0-6 一周中的一天,星期天是 0
dd Su-Sa 最简写的一周中一天的名称
ddd Sun-Sat 简写的一周中一天的名称
dddd Sunday-Saturday 一周中一天的名称
H 0-23 小时
HH 00-23 小时,两位数
m 0-59 分钟
mm 00-59 分钟,两位数
s 0-59
ss 00-59 秒 两位数
SSS 000-999 秒 三位数
Z +5:00 UTC 的偏移量
ZZ +0500 UTC 的偏移量,数字前面加上 0
A AM PM
a am pm

qs

一个轻量的 url 参数转换的 JavaScript 库

  1. npm install qs

基本用法

  1. import qs from 'qs'
  2. qs.parse('user=tom&age=22') // => { user: "tom", age: "22" }
  3. qs.stringify({ user: "tom", age: "22" }) // => user=tom&age=22

js-cookie

一个简单的、轻量的处理 cookies 的 js API

  1. npm install js-cookie

基本用法

  1. import Cookies from 'js-cookie'
  2. Cookies.set('name', 'value', { expires: 7 }) // 有效期7天
  3. Cookies.get('name') // => 'value'
  4. Cookies.get() // 获取所有的Cookies
  5. Cookies.remove('name') // 删除cookie

flv.js

bilibili 开源的 html5 flash 视频播放器,使浏览器在不借助 flash 插件的情况下可以播放 flv,目前主流的直播、点播解决方案。

  1. npm install flv.js

基本用法

  1. <video autoplay controls width="100%" height="500" id="myVideo"></video>
  2. import flvjs from 'flv.js'
  3. // 页面渲染完成后执行
  4. if (flvjs.isSupported()) {
  5. var myVideo = document.getElementById('myVideo')
  6. var flvPlayer = flvjs.createPlayer({
  7. type: 'flv',
  8. url: 'http://localhost:8080/test.flv' // 视频 url 地址
  9. })
  10. flvPlayer.attachMediaElement(myVideo)
  11. flvPlayer.load()
  12. flvPlayer.play()
  13. }

Animate.css

一个跨浏览器的 css3 动画库,内置了很多典型的 css3 动画,兼容性好,使用方便。

  1. npm install animate.css

基本用法

  1. <h1 class="animate__animated animate__bounce">An animated element</h1>
  2. import 'animate.css'

animejs

一款功能强大的 Javascript 动画库。可以与CSS3属性、SVG、DOM元素、JS对象一起工作,制作出各种高性能、平滑过渡的动画效果。

  1. npm install animejs

基本用法

  1. <div class="ball" style="width: 50px; height: 50px; background: blue"></div>
  2. import anime from 'animejs/lib/anime.es.js'
  3. // 页面渲染完成之后执行
  4. anime({
  5. targets: '.ball',
  6. translateX: 250,
  7. rotate: '1turn',
  8. backgroundColor: '#F00',
  9. duration: 800
  10. })

react-infinite-scroll-component

通过上拉加载获取长列表数据—-实现滚动加载列表的效果。

1. 上拉加载更多

默认以body/window为容器

  1. import React, { useState, useEffect } from 'react';
  2. import request from '@/utils/request';
  3. import InfiniteScroll from 'react-infinite-scroll-component';
  4. export default () => {
  5. const [list, setList] = useState([]);
  6. const requestList = () => {
  7. setTimeout(async () => {
  8. const response = await request.get('/api/notes/list', {
  9. params: {
  10. name: 12,
  11. },
  12. });
  13. setList(list.concat(response.list));
  14. }, 1000);
  15. };
  16. useEffect(() => {
  17. requestList();
  18. }, []);
  19. return (
  20. <div>
  21. <InfiniteScroll
  22. dataLength={list.length}
  23. next={requestList}
  24. hasMore={false}
  25. endMessage={
  26. <p style={{ textAlign: 'center' }}>
  27. <b>Yay! You have seen it all</b>
  28. </p>
  29. }
  30. loader={<h4>Loading...</h4>}
  31. >
  32. {list.map((item, index) => (
  33. <div style={{ height: 100 }} key={index}>
  34. {item.id}
  35. </div>
  36. ))}
  37. </InfiniteScroll>
  38. </div>
  39. );
  40. };
属性 作用 注意事项
dataLength 当您上拉时,程序会根据这个值有没有发生变化决定是否触发next 当数据发生变化的间隔非常小时,是会触发多次的,比如快速的把滚动条拖到底
next 用户上拉达到阈值时用于加载更多数据
hasMore 是否还有更多的数据 为false时next不会触发
endMessage 没有更多数据时上拉到底部会显示 需要hasMore 为false
scrollThreshold 上拉时触发next,相当于底部的距离 默认是0.8,您可以设置自己的值,比如200px,则会按照 100%-200px,显然,随着滚动区域越来越高,100%越来越大,200固定不变,意味着越往后您越要上拉的更接近底部才会触发next

在指定区域内触发

只需要使用height

  1. <InfiniteScroll
  2. ...
  3. height={400}
  4. ...
  5. >

指定滚动的父容器

需要用到scrollableTarget,这时候InfiniteScroll 就没必要指定height

  1. <div
  2. id="scrollableDiv"
  3. style={{ height: 300, overflow: 'auto' }}
  4. >
  5. <InfiniteScroll
  6. ...
  7. scrollableTarget="scrollableDiv"
  8. ...
  9. >
  10. ...
  11. </div>

2. 下拉刷新

  1. import React, { useState, useEffect } from 'react';
  2. import request from '@/utils/request';
  3. import InfiniteScroll from 'react-infinite-scroll-component';
  4. export default () => {
  5. const [list, setList] = useState([]);
  6. const requestList = () => {
  7. setTimeout(async () => {
  8. const response = await request.get('/api/notes/list', {
  9. params: {
  10. name: 12,
  11. },
  12. });
  13. setList(list.concat(response.list));
  14. }, 1000);
  15. };
  16. useEffect(() => {
  17. requestList();
  18. }, []);
  19. return (
  20. <InfiniteScroll
  21. style={{ marginTop: 120 }}
  22. height={400}
  23. dataLength={list.length} //This is important field to render the next data
  24. next={requestList}
  25. hasMore={true}
  26. loader={<h4>Loading...</h4>}
  27. refreshFunction={requestList}
  28. pullDownToRefresh
  29. pullDownToRefreshThreshold={30}
  30. pullDownToRefreshContent={
  31. <h3 style={{ textAlign: 'center' }}>
  32. &#8595; Pull down to refresh
  33. </h3>
  34. }
  35. releaseToRefreshContent={
  36. <h3 style={{ textAlign: 'center' }}>
  37. &#8593; Release to refresh
  38. </h3>
  39. }
  40. >
  41. {list.map((item, index) => (
  42. <div style={{ height: 100 }} key={index}>
  43. {item.id}
  44. </div>
  45. ))}
  46. </InfiniteScroll>
  47. );
  48. };
属性 作用 注意事项
pullDownToRefresh 是否开启下拉刷新,默认为false
refreshFunction 触发下拉刷新时调用的函数
pullDownToRefreshContent 未达到下拉阈值显示的内容
releaseToRefreshContent 达到下拉阈值显示的内容

其余的一些属性

https://www.jianshu.com/p/4bb28664ad74 ————- 简书关于此库链接。 官网地址:https://github.com/ankeetmaini/react-infinite-scroll-component