React 之组件&Props
组件的核心
组件允许你将 UI 拆分成独立的可复用的代码片段,并且对每个片段进行独立的思考
组件从概念上类似JS函数,它接受任意的入参('props'),并返回用于描述页面展示内容的React元素
函数组件与 Class 组件
组件的定义有两种方法
编写函数
编写类
编写函数
javascript
function Welcome(props) {
return <h1>{props.name}</h1>;
}
该函数是一个有效的 React 组件,因为它接受唯一带有数据的 props(代表属性)对象并且返回一个 React 元素,这些组件被称为'函数组件',因为它本身就是 JS 函数
编写类
- 通过 ES6 来定义组件
javascript
class Welcome extends React.Component {
render() {
return <h1>Hello,{this.props.name}</h1>;
}
}
渲染组件
- React 也可以让用户自定义组件
javascript
function Welcome(props){
return <h1>Hello,{props.name}</h1>
}
const element = <Welcome name="Sara">
ReactDom.render(element,document.getElementById('root'))
这段代码最后的结果就是 Sara
- 调用 ReactDom。render()函数传入作为参数
- React 调用 Welcome 组件并且将{name:'Sara'}作为 props 传入
- Welcome 组件将
<h1>Hello,Sara</h1>
作为返回值 - ReactDom 将 DOM 高效的更新为
<h1>Hello,Sata</h1>
特别注意,组件名称必须以大写字母开头,React 会将小写字母开头的组件视作原生 DOM 标签,例如
代表 HTML 的 div 标签,而则代表了一个组件,并且在需要的作用域内使用 Welcome
组件组合
组件可以在其输出引用其他组件,这就可以让我们用同一组来抽象出任何层次的细节。按钮,表单,对话框.甚至整个屏幕的内容,在 React 应用程序中,这些都可以当做组件
例如我们可以多次渲染组件
javascript
function Welcome(props) {
return <h1>Hello,{props.name}</h1>;
}
function App() {
return (
<div>
<Welcome name="Sara" />
<Welcome name="Cahal" />
<Welcome name="Edite" />
</div>
);
}
ReactDOM.render(<App />, document.getElementById("root"));
提取组件
- 有的时候一个组件放不下那么多的逻辑代码所以需要分成几大块
全部组件
javascript
function Comment(props) {
return (
<div className="Comment">
<div className="UserInfo">
<img
className="Avatar"
src={props.author.avatarUrl}
alt={props.author.name}
/>
<div className="UserInfo-name">{props.author.name}</div>
</div>
<div className="Commet-text">{props.text}</div>
<div className="Commet-date">{formatDate(props.date)}</div>
</div>
);
}
这个组件用于描述一个社交网站的评论功能,它接收 author(对象),text(字符串),以及 data(日期)作为 props,该组件由于嵌套关系变得难以维护,所以我们需要拆分出来
拆分开始
- (1) 拆分 Avatar 组件
Avatar 组件
javascript
function Avatar(props) {
return <img src={props.user.avatarUrl} alt={props.user.name} />;
}
- (2) 拆分 UserInfo 组件
javascript
function UserInfo(props) {
return (
<div className="UserInfo">
<Avatar user={props.user} />
<div className="UserInfo-name">{props.user.name}</div>
</div>
);
}
- (3) 最后简化
javascript
function Commet(props) {
return (
<div className="Comment">
<UserInfo user={props.author} />
<div className="Comment-text">{props.text}</div>
<div className="Comment-date">{formatDate(props.date)}</div>
</div>
);
}
Props 的可读性
组件无论是使用函数声明还是通过class声明 都绝对不能修改自身的Props
javascript
function sum(a, b) {
return a + b;
}
我们管这样的函数叫纯函数,因为该函数不会尝试更改入参,并且多次调用下相同的入参始终返回相同的结果
javascript
function withdraw(account, amount) {
account.total -= amount;
}
总结
- props 里面的数据绝对不能更改
- 组件的定义里面必须要有 return,要是一行就不用()要是多行就必须加()
- 组件里面可以嵌套组件,没有个数限制。为了更好的使用,建议拆分组件