- 原文地址:What I wish I knew when I started to work with React.js
- 原文做者:David Yu
- 译文出自:掘金翻译计划
- 本文永久连接:github.com/xitu/gold-m…
- 译者:xionglong58
- 校对者:xujiujiu,wznonstop
自从 2013 年 5 月 29 日发布初始版本以来,React.js 迅速抢占互联网。很明显,包括我在内的不少开发者都从这一神奇的架构中获益。html
在 Medium 中有不少关于 React.js 的教程,我真但愿在初学 React.js 的时候,其中能有一篇能告诉我下面所列的一些小窍门。前端
一般,当你有一个受控组件的时候,你的程序多少会包含下面的内容:react
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)
,是由于大多数教程告诉你得那样作。当你有不少受控组件的时候,你的 constructor(){}
将会显得特别臃肿。android
class Foo extends React.Component{
handleClick = (event) => {
// your event handling logic
}
render(){
return (
<button type="button"
onClick={this.handleClick}>
Click Me
</button>
);
}
}
复制代码
咋样?ios
ES6 中的箭头函数使用词法做用域让方法可以访问其被定义位置的 this
。git
service worker 有利于渐进式 web 应用,它使得网页可以离线访问,并在用户的网络链接状态差时进行优化。github
可是,若是你没有意识到 service worker 在缓存你的静态文件,你会反复尝试进行热替换操做。web
却发现网站一直得不到更新。😰npm
莫慌张, 确保你的 src/index.js
文件中有如下内容:json
// 确保注销 service worker
serviceWorker.unregister();
复制代码
从 React.js 的 16.8 版开始,上面一行默认就是 serverWorker.unregister()
。
可是,若是之后版本有变化,你也会知道在哪儿进行修改。
Create React App 提供一个命令 yarn eject
,使得你可以定制项目的构建过程。
还记得我曾为了在代码中自动内嵌 SVG 图片而尝试去本身配置构建过程。我花了大量的时间去了解整个构建过程。最终咱们获得了一个注入了 SVG 标签的导入文件,并将站点的加载速度只提升了 0.0001 毫秒。
eject 你的 React 项目就像是打开运行中汽车的引擎盖,并在行驶中更换引擎同样。
固然了,若是你是一名 Webpack 大佬,那么为了知足项目的需求而去定制构建过程也是值得的。
若是你只是想按时完成任务,那就把精力所有集中在可以推进你前进的地方。
你可能也曾从某些地方拷贝过格式混乱的代码。因为没法接受它“丑陋”的格式,你不得不花时间手动加一些空格啥的。
有了 ESLint 和 Visual Studio Code 插件,代码会在你保存文件时自动对齐。
package.json
文件中添加一些 dev dependencies 并执行命令 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"
}
复制代码
每种工具都有其用途,了解不一样的工具也确实是件好事。
若是你手里有一把锤子,全部东西看上去都像钉子。—— 亚伯拉罕·马斯洛
使用一些库时你须要考虑引入它们的时间成本,还要考虑下面的几个问题:
我将要去解决什么问题?
项目可否长久的受益于这个库吗?
React 自己是否是已经提供了现成的解决方法?
当 React 有 Context 和 Hooks 时, 你真的还须要 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>
);
}
}
复制代码
小白时期的我可能会写下面的程序:
constructor(props) {
super(props);
this.state = {
isFiltered: false
};
}
toggleFilter = () => {
this.setState({
isFiltered: !this.state.isFiltered
});
this.filterData();
};
filterData = () => {
// this.state.isFiltered 值应该为 true,但事实上却为 false
if (this.state.isFiltered) {
// Do some filtering
}
};
复制代码
toggleFilter = () => {
const currentFilterState = !this.state.isFiltered;
this.setState({
isFiltered: currentFilterState
});
this.filterData(currentFilterState);
};
filterData = (currentFilterState) => {
if (currentFilterState) {
// 作些过滤操做
}
};
复制代码
toggleFilter = () => {
this.setState((prevState) => ({
isFiltered: !prevState.isFiltered
}), () => {
this.filterData();
});
};
filterData = () => {
if (this.state.isFiltered) {
// 作些过滤操做
}
};
复制代码
这些小窍门节省了我不少时间,我也相信还有不少关于 React.js 的小窍门。请在评论区自由评论、分享你所知道的小窍门。
(广告时间)若是你但愿你的网站与微信平台进行结合,并得到 10 亿以上的用户,快注册获取微信经常使用术语词汇表.
若是发现译文存在错误或其余须要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可得到相应奖励积分。文章开头的 本文永久连接 即为本文在 GitHub 上的 MarkDown 连接。
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、前端、后端、区块链、产品、设计、人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。