javascript - 在未呈现的组件中访问不正确的属性时出错
问题描述
所以我有这个组件,它接收一个组件并在满足条件时呈现子组件,
const Can = ({ condition, children }) => (condition ? children : null);
const obj = { a: 2 };
export default function App() {
return (
<div className="App">
<Can condition>Condition true</Can>
<Can>
{console.log('Inside false condition')}
<p>False condition {obj.b.x}</p> {/* b.x will throw error */}
</Can>
</div>
);
}
这肯定会失败,但我不明白反应在什么时候解析它的内容?condition
如果为假,为什么执行console.log ?
将子项作为函数调用时不会发生此错误
const Can = ({ condition, children }) => (condition ? children() : null);
const obj = { a: 2 };
export default function App() {
return (
<div className="App">
<Can>
{() => <p>False condition {obj.b.x}</p>}
</Can>
</div>
);
}
解决方案
React 在编译时将其内容解析为 Javascript。所以发生的事情是,在编译之后,当 DOM 构建开始时,所有组件都被一个接一个地挂载。当Can
要安装一个组件时,它的子组件将被处理并作为children
道具传递。在该处理期间,该console.log
语句被执行,您会看到输出。此外,错误来了,在这个处理过程中只有当obj.b.x
没有找到。
在第二种情况下,当您将子项作为函数传递时,JSX 返回一个函数,该函数仅在条件为真时执行,因为在您的情况下条件为假,因此不会处理段落标记,因此不会出现错误.
在此处检查子组件的日志记录,您会得到一个更好的主意。
推荐阅读
- python - 如何从不同的网站抓取数据?
- google-cloud-platform - 由于依赖错误,在 Cloud Build 文件中导入 OVA
- php - IIS URL 转发使用 KLEIN.php 报告 HTTP 错误 404
- c# - WPF 是否允许将数据网格转换为视觉类型?
- c++ - 为什么静态成员不能在头文件中用#pragma 定义一次
- python - Python没有在pygame中进入for循环
- powershell - 对照另一个 csv 文件中的每一行检查 csv 文件值
- python - 我怎样才能得到我需要的桌子?
- css - 动画效果 css
- ios - 在 iPhone 文件 APP 中以编程方式创建文件夹