学习 React.js 比你想象的要简单
1、React 全部都是组件化的
React 是围绕可重用组件的概念设计的。你定义小组件并将它们组合在一起形成更大的组件。
无论大小,所有组件都是可重用的,甚至在不同的项目中也是如此。
React 组件最简单的形式,就是一个普通的 JavaScript 函数:
function Button (props) {
// 这里返回一个 DOM 元素,例如:
return
}
// 将按钮组件呈现给浏览器
ReactDOM.render(
例 1:编辑上面的代码并按Ctrl+Enter 键执行(译者注:译文暂时没有这个功能,请访问原文使用此功能,下同)
括号中的 button 标签将稍后解释。现在不要担心它们。ReactDOM 也将稍后解释,但如果你想测试这个例子和所有接下来的例子,上述render 函数是必须的。(React 将要接管和控制的是ReactDOM.render 的第 2 个参数即目标 DOM元素)。在 jsComplete REPL 中,你可以使用特殊的变量 mountNode。
例 1 的注意事项:
组件名称首字母大写,Button。必须要这样做是因为我们将处理 HTML 元素和 React 元素的混合。小写名称是为 HTML 元素保留的。事实上,将 React 组件命名为 “button” 然后你就会发现 ReactDOM 会忽略这个函数,仅仅是将其作为一个普通的空 HTML 按钮来渲染。
每个组件都接收一个属性列表,就像 HTML 元素一样。在 React 中,这个列表被称为属性。虽然你可以将一个函数随意命名。
在上面 Button 函数组件的返回输出中,我们奇怪地写了段看上去像 HTML 的代码。这实际上既不是 JavaScript 也不是 HTML,老实说,这甚至不是 React.js。然而它非常流行,以至于成为 React 应用程序中的默认值。这就是所谓的 JSX,这是一个JavaScript 的扩展。JSX 也是一个折中方案!继续尝试并在上面的函数中返回其他 HTML 元素,看看它们是如何被支持的(例如,返回一个文本输入元素)。
2、 JSX 输出的是什么?
上面的例 1 可以用没有 JSX 的纯 React.js 编写,如下:
function Button (props) {
return React.createElement(
"button",
\{ type: "submit" \},
props.label
);
}
// 要使用 Button,你可以这么做
ReactDOM.render(
React.createElement(Button, { label:”Save” }),
mountNode
);
例 2:不使用 JSX 编写 React 组件
在 React 顶级 API 中,createElement 函数是主函数。这是你需要学习的 7 个 API 中的 1 个。React 的 API 就是这么小。
就像 DOM 自身有一个document.createElement 函数来创建一个由标签名指定的元素一样,React 的 createElement 函数是一个高级函数,有和document.createElement 同样的功能,但它也可以用于创建一个表示 React 组件的元素。当我们使用上面例 2 中的按钮组件时,我们使用的是后者。
不像 document.createElement,React 的 createElement 在接收第二个参数后,接收一个动态参数,它表示所创建元素的子元素。所以 createElement 实际上创建了一个树。
这里就是这样的一个例子:
const InputForm = React.createElement(
“form”,
{ target: “_blank”, action:”https://google.com/search“ },
React.createElement(“div”,null, “Enter input and click Search”),
React.createElement(“input”, {className: “big-input” }),
React.createElement(Button, { label:”Search” })
);
// InputForm 使用 Button 组件,所以我们需要这样做:
function Button (props) {
return React.createElement(
"button",
\{ type: "submit" \},
props.label
);
}
// 然后我们可以通过 .render 方法直接使用 InputForm
ReactDOM.render(InputForm, mountNode);
例 3:React 创建元素的 API
上面例子中的一些事情值得注意:
InputForm 不是一个 React 组件;它仅仅是一个 React 元素。这就是为什么我们可以在ReactDOM.render 中直接使用它并且可以在调用时不使用
React.createElement 函数在前两个参数后接收了多个参数。从第3个参数开始的参数列表构成了创建元素的子项列表。
我们可以嵌套 React.createElement 调用,因为它是 JavaScript。
当这个元素不需要属性时,React.createElement 的第二个参数可以为空或者是一个空对象。
我们可以在 React 组件中混合HTML 元素。你可以将 HTML 元素作为内置的 React组件。
React 的 API 试图和 DOM API 一样,这就是为什么我们在 input 元素中使用 className 代替 class 的原因。我们都希望如果 React 的 API 成为 DOM API 本身的一部分,因为,你知道,它要好得多。
上述的代码是当你引入 React 库的时候浏览器是怎样理解的。浏览器不会处理任何 JSX 业务。然而,我们更喜欢看到和使用 HTML,而不是那些 createElement 调用(想象一下只使用document.createElement 构建一个网站!)。这就是 JSX 存在的原因。取代上述调用 React.createElement 的方式,我们可以使用一个非常简单类似于HTML 的语法:
const InputForm =
还没有评论,来说两句吧...