我已经使用 React 多年,我确信我非常了解它,但最近我的老板对我说,“你根本不知道 React,你对它一无所知。”
按需搭建网站可以根据自己的需求进行定制,成都网站建设、网站设计构思过程中功能建设理应排到主要部位公司成都网站建设、网站设计的运用实际效果公司网站制作网站建立与制做的实际意义
我很生他的气,但他指出了我程序中的三个漏洞。我现在把它记录下来,也分享给还不知道的小伙伴。
在React程序中,我经常使用“&&”运算符来决定是否显示内容,具体方式如下:
const App = () => {
const [ list, setList ] = useState([])
// Simulation request data
setTimeout(() => {
setList([ 'fatfish', 'medium' ])
}, 2000)
return (
{ list.length &&}
)
}
我老板:“你不知道&&”运算符的特点吗?当请求还没有成功返回时,会直接渲染“0”。
我不服气,因为我一直都是这样写代码,从来没有犯过错误。为了证明老大错了,我写了下面的例子。
const List = ({ list = [] }) => {
return (
{
list.map((name) => {
return{ name }
})
}
)
}
const App = () => {
const [ list, setList ] = React.useState([ ])
// Simulation request data
setTimeout(() => {
setList([ 'fatfish', 'medium' ])
}, 3000)
return (
list.length &&
)
}
ReactDOM.render(, document.getElementById('app'))
我的天啊!老大说的对,一开始页面显示0,3秒后显示列表。
来自 MDN的提示:“当且仅当所有操作数都为真时,一组布尔操作数的逻辑与 (&&) 运算符(逻辑合取)才为真。否则就是假的。”
更一般地,运算符返回从左到右计算时遇到的第一个假操作数的值,或者如果它们都是真值,则返回最后一个操作数的值。
例子如下:
const x1 = 0
const x2 = 'fatfish'
const x3 = 1
const x4 = 'medium'
console.log(x1 && x2) // 0
console.log(x3 && x4) // medium
现在我终于明白为什么写这样的代码会导致错误。原因如下:
list.length &&
0 &&// 0
我找到了三种方法来解决这个问题。我希望你不要犯和我一样的错误,祝福你。
// 1. Convert list.length to boolean
!!list.length &&
// 2. Use ternary expressions and null
list.length ?: null
// 3. Controlled by specific logic
list.length >= 1 &&
我猜你写过类似的代码。当向
const Container = ({ children }) => {
if (children) {
return (
The content of children is:
{ children }
)
} else {
return (
empty
)
}
}
我的老板:“你要小心使用‘children’属性,它会导致逻辑异常!就像在以下情况中一样。”
你认为这个例子会显示什么——“空”?
不幸的是,答案是另一个。你是不是也觉得不可思议?朋友们,我们一定要非常小心地使用 props.children。否则,老板可能会扣你的工资。
const Container = ({ children }) => {
if (children) {
return (
The content of children is:
{ children }
)
} else {
return (
empty
)
}
}
const App = () => {
const [ list, setList ] = React.useState([])
return (
{
list.map((name) => {
return{ name }
})
}
)
}
ReactDOM.render(, 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 (
The content of children is:
{ children }
)
} else {
return (
empty
)
}
}
在 React 中通过状态来切换组件是很常见的,但是,这个小东西也会让你感到困惑。
在下面的代码中,你认为当你切换name的值时,一个Demo组件会被卸载,另一个会被挂载吗?
class Demo extends React.Component {
componentDidMount() {
console.log('componentDidMount', this.props.name);
}
componentDidUpdate() {
console.log('componentDidUpdate', this.props.name);
}
render () {
return (
{ this.props.name }
)
}
}
const App = () => {
const [ name, setName ] = React.useState('fatfish')
const onClick = () => {
setName(name === 'fatfish' ? 'medium' : 'fatfish')
}
return (
{
name === 'fatfish' ?
:
}
)
}
ReactDOM.render(, document.getElementById('app'))
我录制了一个简短的 gif 给你真相。
你也可以通过 CodePen 试试,https://codepen.io/qianlong/pen/NWywodV
虽然,我们写了两个 Demo 组件,假设它们会分别挂载和更新,但 React 认为它们是同一个组件,所以 componentDidMount 只会执行一次。
但是当我们要写两个相同的组件但是传递不同的参数时,我们应该怎么办呢?
是的,你应该为这两个组件添加不同的键,这样 React 就会认为它们是不同的组件。componentDidMount 也会单独执行。
我们试试看:
//...
// Pay attention here
name === 'fatfish' ?:
//...
你也可以通过 CodePen 试试,https://codepen.io/qianlong/pen/NWywodV。
新闻名称:我老板:你根本不懂 React!
文章网址:http://www.shufengxianlan.com/qtweb/news44/64144.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联