【发布时间】:2017-05-31 15:47:03
【问题描述】:
假设我这样定义一个简单的 React 函数式组件:
const Greeter1 = ({name}) => <h1>Hello {name}</h1>;
我还可以定义一个等效的普通 JS 函数,它返回一个 React 元素,如下所示:
const Greeter2 = name => <h1>Hello {name}</h1>;
“React”版本当然也只是一个普通的 JS 函数,接收一个 JS 对象而不是一个字符串。我们可以在纯 JS 中使用这些函数中的任何一个来获取给定名称的 greeter 元素,只是调用者语法略有不同:
const greeterElement1 = Greeter1({ name: "Bob" });
const greeterElement2 = Greeter2("Bob");
不过,在 React 表达式中,我们可以通过几种不同的方式调用这些函数:
const someReact1 = <div>{ Greeter2("Bob") }</div>;
const someReact2 = <div>{ Greeter1({ name: "Bob" }) }</div>;
const someReact3 = <div><Greeter1 name="Bob" /></div>;
我的问题:除了语法美学之外,这些调用风格之间是否有任何有效的区别?我假设someReact1 和someReact2 几乎相同,但我不确定someReact3。使用 React 组件语法会改变 React 处理事物的方式吗?它是否以任何方式影响行为或表现?还是仅仅是语法糖?
当在虚拟 DOM 树上做一个 diff 时,如果它的属性在渲染之间没有改变,React 是否会放弃在功能组件内进行比较?如果是这样,我假设在someReact1 中直接调用函数时会丢失优化是否正确?
我想知道 b/c 在某些情况下我实际上更喜欢 someReact1 的风格,因为它使我可以更轻松地使用函数式编程技术,例如柯里化,而且有时在调用时不必指定参数名称也很好。但我这样做是不是要付出某种代价?我最好还是坚持传统的语法?
【问题讨论】:
-
我自己也在思考这个问题。到目前为止,我发现
<Greeter1 />基本上编译为React.createElement(Greeter1),而像{Greeter1()}这样嵌入在JSX 中的函数调用在编译时并没有真正改变。这就是我所得到的,但我认为这才是真正的区别。这对我还没有弄清楚的事情有什么影响。它们在 HTML 树中呈现相同。不确定它们在 React 的虚拟 DOM 中是什么样子的。 -
由于虚拟 DOM 的差异,事物的行为方式也可能出现意想不到的差异。这给我今天造成了一个破坏布局的 CSS 错误:stackoverflow.com/questions/67242769/…
标签: javascript reactjs react-jsx