可以将React组件定义为扩展基React.Component类的ES6类。组件必须以其最小形式定义一个render方法,该方法指定该组件如何呈现给DOM。该render方法返回React节点,可以使用JSX语法将其定义为类似HTML的标签。以下示例显示了如何定义最小组件:
import React from 'react' class HelloWorld extendsReact.Component{ render() { return <h1>Hello, World!</h1> } } export default HelloWorld
组件也可以接收props。这些是其父级传递的属性,用于指定组件本身无法知道的一些值。属性还可以包含一个函数,该组件可以在某些事件发生后由组件调用-例如,按钮可以接收其onClick属性的函数,并在单击该按钮时调用它。编写组件时,props可以通过propsComponent本身上的对象来访问它:
import React from 'react' class Hello extendsReact.Component{ render() { return <h1>Hello, {this.props.name}!</h1> } } export default Hello
上面的示例显示了组件如何呈现name其父级传递到prop中的任意字符串。请注意,组件无法修改其收到的道具。
组件可以在任何其他组件中呈现,或者如果是最顶层的组件,则可以直接呈现到DOM中,使用ReactDOM.render并向其提供要呈现React树的组件和DOM节点:
import React from 'react' import ReactDOM from 'react-dom' import Hello from './Hello' ReactDOM.render(<Hello name="Billy James" />, document.getElementById('main'))
现在,您已经知道如何制作基本组件并接受props。让我们更进一步并介绍state。
为了演示起见,让我们制作Hello World应用程序,如果给出了全名,则仅显示名字。
import React from 'react' class Hello extendsReact.Component{ constructor(props){ //由于我们要扩展默认构造函数, //首先处理默认活动。 super(props); //从道具中提取名字 let firstName = this.props.name.split(" ")[0]; //在构造函数中,随时修改 //当前上下文的state属性。 this.state= { name: firstName } } //看起来不错,在基于JSX的类def中不需要逗号! render() { return <h1>Hello, {this.state.name}!</h1> } } export default Hello
注意:每个组件都可以具有自己的状态,也可以接受其父级的状态作为道具。
Codepen链接到示例。