React官网(2)—组件和属性
来源:互联网 发布:心事谁人知葫芦丝 编辑:程序博客网 时间:2024/06/06 03:05
组件和属性
组件将UI分为独立、可重复利用的部分,且每一部分可以单独考虑。
概念上来讲组件就像JS函数:接受随机输入(叫做props),并返回React元素描述在屏幕上。
- 函数形式的组件和类形式的组件
最简单定义组件的方法是写一个函数。
function Welcome(props){
return <h1>hello,{props.name}</h1>;
}
这种函数是一个“空”React组件因为它接受一个单独的“props”数据对象参数并返回一个React 元素。
我们叫这种组件为“函数化”,因为它们就是一个JS函数
或者使用ES6class定义一个组件
Class Welcome extends React.Compoent{
Render(){
Return <h1>hellom{props.name}</h1>;
}}
这两种定义方式在React看来是等价的。但类定义的组件有一些额外的特性。
- 渲染一个组件
以前,我们遇到的React元素都是以DOM标签表示的。
const element = <div />
然而,元素也可以使用用户定义的组件来表示
const element = <Welcome name=”Sara” />
当React遇到一个元素代表用户定义的组件时,它将JSX属性作为一个单独的对象传递给这个组件,我们把这个对象叫做“props”
例如下面这个例子,它在网页上会显示出“Hello,Sara”
function Welcome(props){
return <h1>Hello,{props.name}</h1>
}
const element = <Welcome name=”Sara” />
ReactDOM.render(
element,
document.getElementById(‘root’)
);
让我们看看这个例子里发生了什么:
1. 我们使用<Welcome name=’Sara’/>元素调用ReactDOM.render
2. React调用带有name参数作为props的welcome组件
3. 组件Welcome返回了<h1>Hello,Sara</h1>元素作为结果
4. ReactDOM更新了DOM来匹配这个元素
PS:组件总是以大写字母开头
- 构成组件
组件可以嵌套在其他组件中,也可以使用相同的组件抽象应用。包括按钮、表单、对话框等,都可以描述为组件。
例如,我们可以创建一个App组件多次渲染Welcome
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')
);
这个Reactapps有一个单独的组件App在DOM树顶部。但如果你将它放入一个已经存在的APP中,它可能从最低端的小组件例如Button按钮开始逐渐渲染至视图层的顶端。
PS:组件必须返回一个单独的根元素。这就是为什么<div>要包含所有的<welcome>
- 组件分离
不要害怕将组件分离为更小的组件
考虑下面这个Comment组件
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="Comment-text">
{props.text}
</div>
<div className="Comment-date">
{formatDate(props.date)}
</div>
</div>
);
}
它接受作者(一个对象),文本(一个字符串)和日期作为props来描述一个社交网站的评论
这个组件很难被重用,我们可以分离一些组件。
首先,我们可以分离Avatar
function Avatar(props) {
return (
<img className="Avatar"
src={props.user.avatarUrl}
alt={props.user.name}
/>
);
}
Avatar组件并不需要知道自己将要被渲染进Comment组件,这样做我们可以给她一个更一般的名字:user而不是author。
我们建议从组件的角度来命名属性(props),而不是根据它所要被使用的上下文。
现在我们可以稍微简化一点Comment组件
function Comment(props) {
return (
<div className="Comment">
<div className="UserInfo">
<Avatar user={props.author} />
<div className="UserInfo-name">
{props.author.name}
</div>
</div>
<div className="Comment-text">
{props.text}
</div>
<div className="Comment-date">
{formatDate(props.date)}
</div>
</div>
);
}
接着,我们可以将UserInfo组件提出来,将Avatar渲染进这个组件
function UserInfo(props) {
return (
<div className="UserInfo">
<Avatar user={props.user} />
<div className="UserInfo-name">
{props.user.name}
</div>
</div>
);
}
现在我们更进一步简化了Comment组件
function Comment(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>
);
}
分离组件刚开始可能是一项繁杂的工作,但是在更大型的应用中一组可重用的组件可以减轻不少工作量。
比较好的考虑办法是如果你的UI的一部分会被多次使用(例如按钮、面板、头像)或者app本身是一个相当复杂的应用(App、评论等),分离组件增加可重用性是一个bi比较
将组件中更小的组件分离出来形成可重用的组件。
- Props是只读的
无论组件的描述形式是怎样,都无法改变它的props。
function sum(a, b) {
return a + b;
}
这类函数被称为纯函数,因为它不会尝试改变输入,且相同的输入会有相同的结果
相反,下面这类函数就会改变输入
function withdraw(account, amount) {
account.total -= amount;
}
React有一个原则:
所有的React组件必须对其性质必须表现的像纯粹的函数一样:相同的输入有相同的输出
当然,应用程序UI是动态的、并且是根据时间变化的。下节会介绍状态这个概念,它允许React组件随着时间对用户行为、网络响应等作出反应改变输出,这并不违背上述原则。
- React官网(2)—组件和属性
- React--Components and Props(组件和属性组件)
- 4.React中文之组件和属性
- React Popos属性和组件传参
- React PropTypes 定义组件的属性类型和默认属性
- React组件属性类型(propTypes)
- React组件属性类型(propTypes)
- React学习之让组件和属性齐飞(三)
- React Native探索(三)组件的Props(属性)和State(状态)
- React组件定义验证属性值和默认值的配置
- React组件属性类--propTypes
- React组件的属性PropTypes
- React组件的自定义属性
- React组件属性类--propTypes
- React1 创建React组件、组件的属性
- React Native入门(十)之导航组件React Navigation(2)TabNavigator和DrawerNavigator
- React源码分析2 — 组件和对象的创建(createClass,createElement)
- React组件属性props部类(propTypes)校验
- Linux — 管道与管道间通信详解
- 如何做一个高质量的网站页面?
- $(document).ready()与window.onload的区别
- LeetCode-455. Assign Cookies (Java)
- break、continue和return的区别
- React官网(2)—组件和属性
- iOS项目的目录结构和开发流程
- 垃圾回收器
- jquery-- 获取自定义数据的值
- bmp 缩放代码(BMP位图任意放大 和缩小)
- 全栈必备 JavaScript基础
- 友盟社会化分享
- 2017.06.20 安装VS 2015错误总结
- Ubuntu安装iNOde