javascript - 我们是否允许在功能组件的 return 之外使用 JSX?
问题描述
我有一个简单的问题,因为我对功能组件中的 JSX 有点困惑。
我正在做一个小项目来探索 useState() 的更复杂用途,在这个挑战的最后一部分,您必须将您键入的联系人呈现到输入表单中。
这是我的代码:
import React, { useState } from "react";
function App() {
const [inputData, setInputData] = useState({ firstName: "", lastName: "" });
const [contactsData, setContactsData] = useState([]);
function handleChange(event) {
const { name, value } = event.target;
setInputData((prevData) => {
return {
...prevData,
// will copy over all properties from the previous input data and then replace whichever one we are currently working on with the updated value
[name]: value,
};
});
}
function handleSubmit(event) {
event.preventDefault();
setContactsData((prevContacts) => [...prevContacts, inputData]);
}
const contacts = contactsData.map((contact) => (
<h2 key={contact.firstName + contact.lastName}>
{contact.firstName} {contact.lastName}
</h2>
));
return (
<>
<form onSubmit={handleSubmit}>
<input
placeholder="First Name"
name="firstName"
value={inputData.firstName}
onChange={handleChange}
/>
<input
placeholder="Last Name"
name="lastName"
value={inputData.lastName}
onChange={handleChange}
/>
<br />
<button>Add contact</button>
</form>
{contacts}
</>
);
}
export default App;
我的问题是为什么const 联系人在返回之外有 JSX?我以为所有的 JSX 都必须在回报之内?
当我尝试在没有外部 const 变量的情况下输入联系人时,我得到一个参考错误?
谢谢!
解决方案
你可以把 JSX 放在任何你喜欢的地方。虽然 JSX 看起来有点像 html,但它实际上被转换为对 React.createElement 的一系列调用。例如,您想知道的一段代码被转译成:
const contacts = contactsData.map(contact => {
return React.createElement(
"h2",
{ key: contact.firstName + contact.lastName },
contact.firstName,
" ",
contact.lastName
);
});
对 React.createElement 的每次调用都会返回一个对象,该对象描述要呈现给页面的该部分的内容。你可以对这些对象做任何你喜欢的事情。大多数情况下,您将从函数中返回它们(就像您习惯的那样),但也可以将它们分配给变量,就像这里发生的那样。
因此,如果您在 return 语句中执行此操作,您将在行中创建一个数组,然后将其作为参数之一传递给对 React.createElement 的调用。使用您实际编写的代码,您将创建相同的数组,只需预先完成并将其保存到变量中,然后稍后将其传递给 React.createElement。
推荐阅读
- nlp - 如何在词嵌入中插入信息?
- python - sqlite3.InterfaceError:错误绑定参数 0 - 可能是不支持的类型?
- python - 在python中将字符串与文本文件进行比较
- html - 如何使文本从表格单元格的底部开始?
- python - 层次嵌套字典创建新功能
- r - 根据最近的日期更新非缺失值
- python - 在函数中更新时python类属性不更新
- pandas - 熊猫:如何选择数据框类型为列表的列?
- laravel - 为什么调用未定义的方法 Srmklive\PayPal\Services\PayPal::setExpressCheckout()
- java - Take a number (1 to 10 length) transform it to indexes and base of this indexes retrieve the specific Strings from an array in Java