Skip to content

第三方库笔记

统计信息:字数 9685 阅读20分钟

原始笔记链接:https://cloud.seatable.cn/dtable/external-links/59b453a8639945478de2/

0029 vue中的双向绑定和数据流

早期 vue就是双向绑定组件,实现数据通信

最新的版本当中,已经变成了单向数据流,就是从父组件到子组件进行单向的数据传递。

0047 双向绑定和vuex是否冲突

vuex 是 vue 的状态管理工具

这个涉及的不多,这个实际上是不冲突的(新版本使用单向数据流,取消了双向绑定的情况)

可以在时间回调当中使用 mutation 修改state的值,或者是用set的双向绑定来计算属性

0103 多语言网站应该怎么处理

翻译模块 react-intl 处理 i18n

时间模块(dayjs moment)这里需要根据当地时间处理时区转换

使用一些数字和格式的模块 格式化数字和货币

0140 绘图库 echarts 学习

常用的几个类型,基本的配置(两个轴,数据,标签,图例等)柱状图(条形图)、折线图、饼图、散点图;以蜡烛图为例,设置一个比较复杂的应用实例。

0168 你用过哪些UI组件库,具体有哪个常用的组件?

这个问题是第三方组件层级

PC端主要是 reactstrap 举出其他主要的常用的组件

移动端主要是 ant Design mobile,现在已经到 5.x.x 参考 https://mobile.ant.design/zh/components/button

分类:

用户交互组件:表单,输入框,按钮 Form Input Button Switch Checkbox

展示信息组件:Nav Card Swiper(走马灯)

提示组件:Toaster Tooltip Dialog Popover

其他特殊:图标,日历,进度条

0174 有什么可视化的工具和库

蚂蚁集团出的 charts g2

AntV 3.0 已全新升级,主要包含 G2、G6、F2、L7 以及一套完整的图表使用和设计规范 https://antv.vision/zh

自己的实践:若干统计图表

条形图,折线图,饼图,蜡烛图,以及各种组合

0169 你自己的项目里边有哪些主要的组件和界面,包括什么样的架构?

这个主要是项目的页面和广度

1、文件管理项目 前端 React 文件结构

2、表格管理项目 前端 React 表格结构

3、小说编辑器 React全栈

4、校园网小程序 小程序

0178 react-dnd 实现拖拽的基本思路

基于项目中的 dnd 版本,2.6.0 版本

react-dnd 是一个支持 react 拖动库,使用了高阶组件和 redux 等设计思路,基本使用

1、设置最外层一个可拖动对象 html5DragLayer 拖动上下文

import { DragDropContext } from 'react-dnd';
import HTML5Backend from 'react-dnd-html5-backend';

export default DragDropContext(HTML5Backend);

html5DragDropContext(DropTarget) 包裹被拖动组件

2、主要函数:

dragSource:拖动的源,包括 beginDrag endDrag isDragging 三个对象,用来表示拖动不同阶段返回的值(当前拖动的内容,当前拖动的索引等)

dropTarget:释放对象,包括 drop 函数,通过 monitor.getItem 获取拖动的对象,执行对应操作

dragCollect:拖动的函数收集,类似 map States to Props 函数,把外部的函数映射到内部

dropCollect:释放的函数收集,同上,把释放的函数映射到组件内部

DropTarget('ViewStructure', dropTarget, dropCollect) (DragSource('ViewStructure', dragSource, dragCollect)(Item));

0373 Next.js 常用函数

常用函数

getStaticProps:此方法用于在构建时获取数据并将页面预渲染为静态 HTML。它确保数据在构建时可用,并且不会因后续请求而更改。

export async function getStaticProps() {
  const res = await fetch('https://api.example.com/data');
  const data = await res.json();

  return {
    props: {
      data
    }
  };
}

getServerSideProps:该方法用于在每次请求时获取数据并在服务器上预渲染页面。当您需要获取可能经常更改或特定于用户的数据时,可以使用它。

export async function getServerSideProps() {
  const res = await fetch('https://api.example.com/data');
  const data = await res.json();

  return {
    props: {
      data
    }
  };
}

getStaticPaths:此方法用于动态路由中,以指定应在构建时预渲染的路径列表。它通常用于获取带有参数的动态路由的数据。

export async function getStaticPaths() {
  const res = await fetch('https://api.example.com/posts');
  const posts = await res.json();

  const paths = posts.map((post) => ({
    params: { id: post.id }
  }));

  return {
    paths,
    fallback: false
  };
}

0253 axios 版本问题

升级 axios 版本问题

造成 jest 单元测试不通过的解决

本质原因:早期 axios 是 common-js 打包的,新版本没有支持 common-js 打包。Jest 执行单元测试在 node 环境下,不支持 es6语法,所以 import axios 就会报错。解决思路是,把 import 语法替换掉

moduleNameMapper: {
    '^axios$': require.resolve('axios'),
},

就是 module name 映射关系,把 import axios 变成 require.resolve('axios') 这样 Jest 就可以测试通过了

其他参考 https://juejin.cn/post/6898738304754286605

0254 HTMLtoCanvas

HTMLtoCanvas 第三方库学习

canvas.toDataUrl('image/png', 1.0)  

配置:

allowTaint

taintTest

allowCORS

使用场景:

统计中 canvas 导出生成 PNG,主页看板娘的 canvas 拍照显示成 png 的功能。

0259 reactstrap 中 popover 点击外部问题

Popover 点击问题:原来通过 event.target.className === 'xxx' 判断,这样如果改变了类名,那么这里判断失效。

最好的办法是 dom.contains() 判断 dom 之间的包含关系,至少使用 includes('xxx') 的形式,避免类名变化造成的问题。如果牵头的层级比较多,这个就可能造成一个事件在树节点中依次传,性能比较差。

这样性能可能不太好。最好的办法是类似对话框,增加一个后面的遮挡,这个层监听点击事件。

0263 raf 库

raf 库

requestAnimationFrame 的 polyfill(简化操作,处理浏览器兼容性)

https://github.com/chrisdickinson/raf#readme

const raf = require('raf')

function callback() {
  // animation function
}

var handle = raf(callback);
handle();
raf.cancel(handle);

0287 react-i18n fallbackLng 是什么

配置项设置了 fallBackLng 表示备用语言,就是主要翻译的语言不显示时,使用备用语言显示。

也造成了界面中加载了两种语言,可能多加载 100 kb 的资源。

0293 jsdom 模拟 node 环境下 window

需求:

node 环境下测试,需要使用全局变量 window ,但是node没有window只有global对象,所以需要这个第三方库模拟虚拟 dom 完成一些测试。

部分项目的测试文件中使用到了window.app,在jest测试中默认情况下是在Node.js环境中运行的,而window在Node.js中未定义,会报错,这里应该使用 jsdom 来手动的创建一下window,

import { JSDOM } from 'jsdom';

const { window } = new JSDOM('<!doctype html><html><body></body></html>');

global.window = window; 

官方链接:https://www.npmjs.com/package/jsdom

官方案例

const jsdom = require("jsdom");

const { JSDOM } = jsdom;
const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
console.log(dom.window.document.querySelector("p").textContent); // "Hello world"

0274 vuecli 如何配置多入口

先确定 vue 是哪个版本,然后看是否和当前文档匹配,需要改动 vue.config.js

module.exports = {
  pages: {
    index: {
      // page 的入口
      entry: 'src/index/main.js',
      // 模板来源
      template: 'public/index.html',
      // 在 dist/index.html 的输出
      filename: 'index.html',
      // 当使用 title 选项时,
      // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>
      title: 'Index Page',
      // 在这个页面中包含的块,默认情况下会包含
      // 提取出来的通用 chunk 和 vendor chunk。
      chunks: ['chunk-vendors', 'chunk-common', 'index']
    },
    // 当使用只有入口的字符串格式时,
    // 模板会被推导为 `public/subpage.html`
    // 并且如果找不到的话,就回退到 `public/index.html`。
    // 输出文件名会被推导为 `subpage.html`。
    subpage: 'src/subpage/main.js'
  }
}

全部配置:https://cli.vuejs.org/zh/config/#pages

0706 dayjs 的注意事项

dayjs 是一个处理日期的库,是 moment 的简化版

注意:如果很多项目存在依赖关系,那么 dayjs 应该选择统一的版本,例如 1.10.7,否则多个版本同时存在,可能日期格式化不正确

0707 calendar 的注意事项

calendar 是阿里巴巴早期做的一个日历组件

如果现在使用,平替的是 html 原生的 input date 可以实现

这个库注意:

1、翻译问题:一部分是库自己的翻译,另一部分翻译是使用的日期库的翻译( moment 或者 dayjs 中的翻译)需要什么语言就用什么翻译,这里一定要引入

2、 value 没有值时 defaultValue 的翻译 = dayjs.now() 处理


Last update: November 9, 2024