当前位置: 首页 > news >正文

React 初学者需要知道的一些知识

作者:valentinogagliardi

译者:前端小智

来源:medium

使用箭头函数时不需要 .bind(this)

通常,如果有一个受控组件时,会有如下的结构:

class Foo extends React.Component{
  constructor( props ){
    super( props );
    this.handleClick = this.handleClick.bind(this);
  }
  handleClick(event){
    // your event handling logic
  }
  render(){
    return (
      <button type="button" 
      onClick={this.handleClick}>
      Click Me
      </button>
    );
  }
}

可以给每个方法加上.bind(this)来解决 this 指向的问题,因为大多数教程都告诉你这样做。如果你有几个受控组件,那么constructor(){}中就会有一大堆代码。

####相反,你可以这样做:

class Foo extends React.Component{
  handleClick = (event) => {
    // your event handling logic
  }
  render(){
    return (
      <button type="button" 
      onClick={this.handleClick}>
        Click Me
      </button>
    );
  }
}

ES6 的箭头函数使用词法作用域,它允许方法访问 this 触发的地方。

当 service worker 与你的代码冲突时

Service workers 非常适合渐进式Web应用程序,它允许离线访问并优化互联网连接较差的用户。

但是当你不知道服务工作者正在缓存静态文件时,你会反复上传热修复程序, 却发现你的网站一直没有更新。

不要惊慌,查看 src/index.js:

// 将它注销掉
serviceWorker.unregister();

从16.8版本开始,默认为 serverWorker.unregister()。

99% 的情况下不需要运行 eject 命令

Create React APP 提供了一个选项 yarn eject,可以弹出项目来定制构建过程。

我记得曾尝试自定义构建过程,使SVG图像自动内联到代码中。 我花了几个小时试图了解构建过程。最后,我们得到了一个导入文件,该文件注入 SVG 标记,我们将网站的加载速度提高了0.0001毫秒。

弹出 React 项目就像打开正在运行的汽车的引擎盖,同时动态地更换引擎,使其运行速度提高1%。

当然,如果你已经是一个 Webpack 高手,那么定制构建过程来定制项目的需求是值得的。

当你想按时完成任务时,把精力集中在它能推动你前进的地方。

ESlint Auto 保存自动格式化可节省大量时间

你可能已经从某些没有格式化的地方复制了一些代码。因为你无法忍受它看起来有多丑,你花时间手动添加空格图片:
https://user-gold-cdn.xitu.io/2019/10/24/16dfb13be1a890b5?imageslim

使用 ESLint 和 Visual Studio 代码插件,它可以在保存时为你格式化它。
https://user-gold-cdn.xitu.io/2019/10/24/16dfb148bf338588?imageslim

要怎么设置

1.在你的 package.json 中,添加一些dev依赖项并执行 npm i或yarn:

"devDependencies": {
 "eslint-config-airbnb": "^17.1.0",
 "eslint-config-prettier": "^3.1.0",
 "eslint-plugin-import": "^2.14.0",
 "eslint-plugin-jsx-a11y": "^6.1.1",
 "eslint-plugin-prettier": "^3.0.0",
 "eslint-plugin-react": "^7.11.0"
}

2.安装 ESLint 插件在这里插入图片描述

3.启动 Auto Fix On Save

在这里插入图片描述

你不需要Redux、styled-components 等等

每种工具都有其目的。也就是说,了解不同的工具是件好事。

如果你手上只有一把锤子,那么所有的东西看起来都像钉子

你需要考虑使用的一些库的设置时间,并将其与之进行比较。

  • 我要解决的问题是什么

  • 这个项目能长久地受益于这个库吗

  • React是否已经提供了一些现成的东西

现在可以使用 React 的 Context 和 Hook,你还需要Redux吗?

当你的用户处于糟糕的互联网连接环境时,我强烈建议使用 Redux Offline。

使用事件处理程序

如果您不想反复输入相同的内容,可以选择重用事件处理程序:

class App extends Component {
 constructor(props) {
  super(props);
  this.state = {
   foo: "",
   bar: "",
  };
 }
 // Reusable for all inputs
 onChange = e => {
  const {
   target: { value, name },
  } = e;
  
  // name will be the state name
  this.setState({
   [name]: value
  });
 };
 
 render() {
  return (
   <div>
    <input name="foo" onChange={this.onChange} />
    <input name="bar" onChange={this.onChange} />   
   </div>
  );
 }
}

setState是异步的

天真的我会写一些像如下的代码:

 constructor(props) {
  super(props);
  this.state = {
   isFiltered: false
  };
 }
 toggleFilter = () => {
  this.setState({
   isFiltered: !this.state.isFiltered
  });
  this.filterData();
 };
 
 filterData = () => {
  //  this.state.isFiltered 应该是 true,但事实并非如此,因为 setState 是异步的
  // isFiltered还没有改变
  if (this.state.isFiltered) {
   // Do some filtering
  }
 };

正确做法一:将状态传递下去

toggleFilter = () => {
 const currentFilterState = !this.state.isFiltered;
 this.setState({
  isFiltered: currentFilterState
 });
 this.filterData(currentFilterState);
};
filterData = (currentFilterState) => {
 if (currentFilterState) {
  // Do some filtering
 }
};

正确做法二:使用 setState 回调函数

toggleFilter = () => {
 this.setState((prevState) => ({
  isFiltered: !prevState.isFiltered
 }), () => {
  this.filterData();
 });
};
filterData = () => {
  if (this.state.isFiltered) {
   // Do some filtering
  }
};

总结

这些技巧为我节省了很多时间,我相信还有更多,欢迎在评论区留言讨论。

代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug。

原文:medium.freecodecamp.org/what-i-wish…

相关文章:

  • 7 个沙雕又带有陷阱的 JS 面试题
  • 大厂前端如何基于 GitLab 进行自动化构建及发布
  • 前端这5个Ajax的坑,你踩过几个?别说都知道
  • Node.js 定时器详解
  • 三年经验前端开发面试总结
  • 框架设计:如何基于 Egg 设计 Node 的服务框架
  • 用好这 42 款 Chrome 插件,每年轻松省出一个年假
  • 解密国内BAT等大厂前端技术体系-百度篇(长文建议收藏)
  • 你总会用到的 JavaScript 工具函数大全(建议收藏)
  • 新手学习 react 迷惑的点(完整版)
  • React Hooks异步操作二三事
  • 三刷红宝书之 JavaScript 的引用类型
  • 20个常用的JavaScript字符串方法
  • webpack 插件机制分析及开发调试
  • 前端知识点汇总—面试看这一篇就够了
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 4个实用的微服务测试策略
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • CSS盒模型深入
  • DataBase in Android
  • Hexo+码云+git快速搭建免费的静态Blog
  • iOS 系统授权开发
  • KMP算法及优化
  • mysql innodb 索引使用指南
  • MYSQL 的 IF 函数
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • react 代码优化(一) ——事件处理
  • WebSocket使用
  • 爱情 北京女病人
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 今年的LC3大会没了?
  • 聚类分析——Kmeans
  • 通信类
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 在Unity中实现一个简单的消息管理器
  • 函数计算新功能-----支持C#函数
  • ​2021半年盘点,不想你错过的重磅新书
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • # 透过事物看本质的能力怎么培养?
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #13 yum、编译安装与sed命令的使用
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (2.2w字)前端单元测试之Jest详解篇
  • (C语言)字符分类函数
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (翻译)terry crowley: 写给程序员
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .net 验证控件和javaScript的冲突问题
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项