服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

我老板:你根本不懂 React!

日期: 来源:web前端开发收集编辑:

英文 | https://javascript.plainenglish.io/my-boss-you-dont-know-react-at-all-f493970f1807

翻译 | 杨小爱

前言
我已经使用 React 多年,我确信我非常了解它,但最近我的老板对我说,“你根本不知道 React,你对它一无所知。”
我很生他的气,但他指出了我程序中的三个漏洞。我现在把它记录下来,也分享给还不知道的小伙伴。
1、你知道“&&”的用法吗?
在React程序中,我经常使用“&&”运算符来决定是否显示内容,具体方式如下:
const App = () => {  const [ list, setList ] = useState([])
// Simulation request data setTimeout(() => { setList([ 'fatfish', 'medium' ]) }, 2000)
return ( <div className="app">{ list.length && <List /> }</div> )}

我老板:“你不知道&&”运算符的特点吗?当请求还没有成功返回时,会直接渲染“0”。

我不服气,因为我一直都是这样写代码,从来没有犯过错误。为了证明老大错了,我写了下面的例子。

const List = ({ list = [] }) => {  return (    <div className="name-list-container">      {        list.map((name) => {          return <div className="name-list-item">{ name }</div>        })      }    </div>  )}
const App = () => { const [ list, setList ] = React.useState([ ])
// Simulation request data setTimeout(() => { setList([ 'fatfish', 'medium' ]) }, 3000)
return ( list.length && <List list={ list }/> )}
ReactDOM.render(<App />, document.getElementById('app'))

我的天啊!老大说的对,一开始页面显示0,3秒后显示列表。

为什么?

来自 MDN的提示:“当且仅当所有操作数都为真时,一组布尔操作数的逻辑与 (&&) 运算符(逻辑合取)才为真。否则就是假的。”

更一般地,运算符返回从左到右计算时遇到的第一个假操作数的值,或者如果它们都是真值,则返回最后一个操作数的值。

例子如下:

const x1 = 0const x2 = 'fatfish'const x3 = 1const x4 = 'medium'console.log(x1 && x2) // 0console.log(x3 && x4) // medium

现在我终于明白为什么写这样的代码会导致错误。原因如下:

list.length && <List list={ list } /> 0 && <List list={ list } /> // 0

如何解决?

我找到了三种方法来解决这个问题。我希望你不要犯和我一样的错误,祝福你。

// 1. Convert list.length to boolean!!list.length && <List list={ list }/>
// 2. Use ternary expressions and nulllist.length ? <List list={ list }/> : null
// 3. Controlled by specific logiclist.length >= 1 && <List list={ list }/>

2.“props.children”的奇怪行为

我猜你写过类似的代码。当向 <Container /> 组件传递内容时,会显示“children”。如果没有,将显示一个空的工具提示。像下面这样:

const Container = ({ children }) => {  if (children) {    return (      <div className="children-container">        <p>The content of children is:</p>        { children }      </div>    )   } else {    return (      <div className="empty">empty</div>    )  }}

我的老板:“你要小心使用‘children’属性,它会导致逻辑异常!就像在以下情况中一样。”

1).清空列表数据

你认为这个例子会显示什么——“空”?

不幸的是,答案是另一个。你是不是也觉得不可思议?朋友们,我们一定要非常小心地使用 props.children。否则,老板可能会扣你的工资。

const Container = ({ children }) => {  if (children) {    return (      <div className="children-container">        <p>The content of children is:</p>        { children }      </div>    )   } else {    return (      <div className="empty">empty</div>    )  }}const App = () => {  const [ list, setList ] = React.useState([])
return ( <Container> { list.map((name) => { return <div className="name-item">{ name }</div> }) } </Container> )}ReactDOM.render(<App />, document.getElementById('app'))

为什么?

让我们向“Container”组件添加一行代码,并尝试打印children是什么!

const Container = ({ children }) => {  console.log(children, 'children')  // ...}

是的,你是对的。此时“children”为空数组,所以显示“children的内容为:”而不是“empty”。

如何解决?

使用 React.Children.toArray 解决这个问题会很容易,然后你会看到显示“empty”。所以如果你真的需要用children作为条件判断,我建议你使用这个方法!

const Container = ({ children }) => {  // if (children) {  // Pay attention here  if (React.Children.toArray(children).length) {      return (      <div className="children-container">        <p>The content of children is:</p>        { children }      </div>    )   } else {    return (      <div className="empty">empty</div>    )  }}

3.关于挂载和更新的问题

在 React 中通过状态来切换组件是很常见的,但是,这个小东西也会让你感到困惑。

在下面的代码中,你认为当你切换name的值时,一个Demo组件会被卸载,另一个会被挂载吗?

class Demo extends React.Component {  componentDidMount() {    console.log('componentDidMount', this.props.name);  }  componentDidUpdate() {    console.log('componentDidUpdate', this.props.name);  }
render () { return ( <div> { this.props.name } </div> ) }}const App = () => { const [ name, setName ] = React.useState('fatfish') const onClick = () => { setName(name === 'fatfish' ? 'medium' : 'fatfish') } return ( <div className="app"> { name === 'fatfish' ? <Demo name={ name } /> : <Demo name={ name } /> } <button onClick={ onClick }>click</button> </div> )}ReactDOM.render(<App />, document.getElementById('app'))

我录制了一个简短的 gif 给你真相。

你也可以通过 CodePen 试试,https://codepen.io/qianlong/pen/NWywodV

为什么?

虽然,我们写了两个 Demo 组件,假设它们会分别挂载和更新,但 React 认为它们是同一个组件,所以 componentDidMount 只会执行一次。

如何解决?

但是当我们要写两个相同的组件但是传递不同的参数时,我们应该怎么办呢?

是的,你应该为这两个组件添加不同的键,这样 React 就会认为它们是不同的组件。componentDidMount 也会单独执行。

我们试试看:

//...// Pay attention herename === 'fatfish' ? <Demo key="1" name={ name } /> : <Demo key="2" name={ name } />//...

你也可以通过 CodePen 试试,https://codepen.io/qianlong/pen/NWywodV

写在最后

以上就是我记录的一次开发体验,如果你觉得有用的话,请点赞我,关注我,并将其分享给你身边的朋友,也许能够帮助到他。

最后,感谢你的阅读,编程快乐!


学习更多技能

请点击下方公众号

相关阅读

  • 所有推荐过的书单合集,一次性打包带走!

  • 大家好,我是小K!众所周知,我是一个热爱读书、热爱分享的人,一路走来,从微博到公众号,整理了太多了资源,也分享了太多的资源,人送外号信息检索小能手,几乎没有什么资料是我找不到的,关
  • No.001 - 835 大合集 · 打包(4350+册)

  • 大家好,我是小K!众所周知,我是一个热爱读书、热爱分享的人,一路走来,从微博到公众号,整理了太多了资源,也分享了太多的资源,人送外号信息检索小能手,几乎没有什么资料是我找不到的,关
  • 知乎故事|哪一瞬间你觉得自己男朋友特别可爱?

  • 写在前面:爱情,一般指的是强烈的依附和爱的感觉的发展,通常是对另一个人。这个过程有时就像跌倒的身体行为一样,是突然的、无法控制的,让人处于一种特殊的状态。但我们与爱情邂逅
  • “是她勾引我的,你们千万别告诉我老婆!”

  • 本故事根据真实案件改编2013年陕西西安的段刚(本文郭刚的原型)自以为遇到一段桃花运,不曾想一时间把持不住自己,陷入了一场谋杀案。差点把自己的后半生葬送在牢狱之中。好在当时
  • 后来,我成为了一位妈妈

  • 大家好,我是木木,很久没和大家见面啦~老粉丝可能记得我们以前画的漫画,多是木木和小捷的日常故事,灵感来源就是我和他的真实生活。(还专门出过木木小捷的周边
  • 粉色是被误解的颜色

  • “粉色是一个被误解的颜色。它应该是生命的颜色,比如肺部和内脏,而不应该只是糖果、玩具以及刻板印象中的很女性的东西。”——美国艺术家Jenny Brown今天我们要介绍的这位法
  • 他花3年在相亲角读爱情诗,被嘲讽、被驱赶

  • 后台回复“读书”即可免费领取52本精读好书文|刘亚萌来源|一条(ID:yitiaotv)上海大学美术学院教师曹再飞,从2019年开始的每个周末和节假日,都会去人民公园相亲角读爱情诗。他曾
  • HMI设计师面试经(01)

  • 最近把同学面试问题进行了汇总,我个人是比较擅长面试,也面过不少的设计师,根据同学们经常问的一些问题做了总结,并给出话术模版。干货在最后↓1、优秀的自我介绍?大学生:展示HMI车
  • 〔自传〕中国人的精神世界

  • 一 仙桃我的家乡是一个没有文化的城市。这句话不带感情色彩,不是修辞,而是事实。从小我就没在家乡见过哪怕一幢年过半百的房子,此地没有遗址也没有古迹,是湖北所有地级市和直管
  • 钱不断往池子里流,哪些板块最受益呢?

  • 一直以来都是给大家分析市场,相信很多朋友都非常好奇我到底买了什么、我是如何买卖的。投资就是这样,没有操作就没有发言权,我会坚持给大家分享我价值稳赢策略的持仓情况,感兴趣

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 我老板:你根本不懂 React!

  • 英文 | https://javascript.plainenglish.io/my-boss-you-dont-know-react-at-all-f493970f1807翻译 | 杨小爱前言我已经使用 React 多年,我确信我非常了解它,但最近我的老板
  • 8 个实用的 NPM 技术

  • 英文 | https://javascript.plainenglish.io/8-useful-javascript-coding-techniques-that-you-should-use-d5d63f7c7037翻译 | web前端开发(ID:web_qdkf)这篇文章,跟大家分享8
  • 【每日一练】108—一个登录页面的实现

  • 写在前面今天我们来写一个登录页面,这个在很多企业系统上都会用到,当然,一些网站上也用应用到,所以,它的应用场景还是很多的。现在,我们一起来看一下它的最终效果:以下是实现的源码
  • 一些顶级 JavaScript 技巧汇总

  • 英文 | https://medium.com/stackanatomy/top-javascript-shorthand-techniques-64920294f0c8JavaScript包含各种对典型编程思想有用的一些技巧,在实际开发中,我们通常希望减
  • 安利3本最近准备看的高分好书!

  • 设为 星 标 永不失联~~生命的过程就是经历的过程。一本好书,所展开的世界是无穷无尽的。翻开书页,和不同时空的自己对话。那些关于时光的思考,帮你戒掉浮躁,静下心来,收获未来成