[译] 在 JSX 代码中可以加入 console.log 吗?

结论:不行!

作为一名编程老师,我曾看到过我的学生写出了这样的代码:

render() {
  return (
    <div>
      <h1>List of todos</h1>
      console.log(this.props.todos)
    </div>
  );
}
复制代码

这样写不会在控制台打印出期望的内容。而是在浏览器上渲染出 console.log(this.props.todos) 这个字符串。

我们先来看一些很直接的解决方案,然后我们将会解释原理。

最常用的解决方式:

在 JSX 中嵌入表达式:

render() {
  return (
    <div>
      <h1>List of todos</h1>
      { console.log(this.props.todos) }
    </div>
  );
}
复制代码

另一个很受欢迎的方式:

return() 语句之前加 console.log

render() {
  console.log(this.props.todos);
  return (
    <div>
      <h1>List of todos</h1>
    </div>
  );
}
复制代码

一种更高级的方式:

使用自定义的 <ConsoleLog> 组件是更高级的方法:

const ConsoleLog = ({ children }) => {
  console.log(children);
  return false;
};
复制代码

然后使用它:

render() {
  return (
    <div>
      <h1>List of todos</h1>
      <ConsoleLog>{ this.props.todos }</ConsoleLog>
    </div>
  );
}
复制代码

为什么是这样?

我们必须记住:JSX 不是原生的 JavaScript,也不是 HTML。它是一种语法扩展。

最终,JSX 会被编译成原生 JavaScript。

例如,如果我们写了如下的 JSX:

const element = (
  <h1 className="greeting">
    Hello, world!
  </h1>
);
复制代码

它将会被编译成:

const element = React.createElement(
  'h1',
  {className: 'greeting'},
  'Hello, world!'
);
复制代码

我们来回顾一下方法 React.createElement 的参数:

  • 'h1':标签名,是一个字符串类型

  • { className: 'greeting' }<h1> 的属性。它会被转换成一个对象。对象的键就是属性名,对象的键值就是属性的值。

  • 'Hello, world!':它被称为 children。位于起始符标签 <h1> 和结束符 </h1> 之间的内容都会被传递进去。

我们现在来回顾一下文章开始的时候写的失败的 console.log:

<div>
  <h1>List of todos</h1>
  console.log(this.props.todos)
</div>
复制代码

这段代码将会被编译为:

// 当一个以上的元素被传递进去,第三个参数将会变成一个数组

React.createElement(
  'div',
  {}, // 没有属性
  [ 
    React.createElement(
      'h1',
      {}, // 也没有属性
      'List of todos',
    ),
    'console.log(this.props.todos)'
  ]
);
复制代码

console.log 被当成一个字符串传递到了方法 createElement。它并没有被执行。

这说得通,上面我们也看到了标题 List of todos。计算机如何能知道,哪段代码是需要被执行的,哪段是你希望渲染的呢?

答案:计算机认为两者都是字符串。计算机一定会将文字作为字符串处理。

所以,如果你希望这段代码被执行,你需要 JSX 中表明,好让它知道如何处理。你可以将代码作为表达式放在 {} 中。

这样就好了!现在你已经知道了在哪里,在何时,如何将 console.log 用于 JSX 代码中了!

如果发现译文存在错误或其他需要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可获得相应奖励积分。文章开头的 本文永久链接 即为本文在 GitHub 上的 MarkDown 链接。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想在React函数组件使用 `HandleChildClick` 函数里的 `valu` 参数,你需要将该函数作为一个属性传递给子组件,并且在子组件调用该函数时传递一个参数。下面是一个示例代码,演示了如何实现这个功能: ```jsx import React from 'react'; function ChildComponent(props) { function handleClick() { const valu = 'example'; props.onChildClick(valu); } return <button onClick={handleClick}>Click me</button>; } function ParentComponent() { function handleChildClick(valu) { console.log(`Received valu ${valu} from child component`); } return <ChildComponent onChildClick={handleChildClick} />; } export default ParentComponent; ``` 在上面的代码,我们定义了两个函数组件 `ParentComponent` 和 `ChildComponent`。在 `ChildComponent` 组件,我们定义了一个名为 `handleClick` 的函数,该函数会在按钮被点击时被触发。在该函数,我们定义了一个名为 `valu` 的常量,并将其值设置为 `'example'`。然后,我们调用了 `props.onChildClick(valu)` 来触发 `ParentComponent` 组件的 `handleChildClick` 函数,并将 `valu` 作为参数传递给该函数。 在 `ParentComponent` 组件,我们定义了一个名为 `handleChildClick` 的函数,该函数会在 `ChildComponent` 组件的按钮被点击时被触发。在该函数,我们可以通过 `valu` 参数来访问 `ChildComponent` 组件传递的值。 最后,我们将 `ChildComponent` 组件作为一个属性传递给 `ParentComponent` 组件,并将 `handleChildClick` 函数作为一个属性 `onChildClick` 传递给 `ChildComponent` 组件。这样,当 `ChildComponent` 组件的按钮被点击时,就会触发 `onChildClick` 函数,并将 `valu` 作为参数传递给该函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值