React怎样创建和使用组件?
Admin 2021-09-02 群英技术资讯 2038 次浏览
这篇文章主要介绍 React中组件的类别以及如何创建和使用组件,对新手学习React有一定的帮助,有这方面学习需要的朋友可以解决参考,接下来小编带着大家一起了解看看。
组件(Components) 让你可以将用户界面分成独立的,可复用的小部件,并可以对每个部件进行单独的设计。
从定义上来说, 组件就像JavaScript的函数。组件可以接收任意输入(称为”props”), 并返回 React 元素,用以描述屏幕显示内容。
Props , 即属性(Property), 在代码中写作 props,故可用 props 指代 properties。
react中有两种组件:类组件(class components)、函数组件(function components)
类组件的定义有如下要求:
在ES6之前,可以通过create-react-class 模块来定义类组件,但是目前官网建议我们使用ES6的class类定义。
使用class定义一个组件:
class App extends Component {
constructor() {
super()
this.state = {}
}
render() {
return <h2>Hello App</h2>
}
}
我们来详细分析一下类组件有哪几个部分
我们可以通过this.state给类组件添加数据对象,我们可以通过this.state.<属性名>去访问我们setState中的属性。
constructor(props) {
super(props);
this.state = {
name:"xhs-rookies"
}
}
render(){
return <h2>{this.state.name}</h2>
}
但是我们想要修改上述例子中的name属性的时候,则必须通过react给我们规定好的setState()方法,去给state添加或者修改其中的数值。
this.state.name = 'new xhs-rookies' //错误的方式,不允许采用
this.setState({ name: 'new xhs-rookies' }) //正确的方式
简单点来说,在 react 中页面是通过数据进行渲染,使用setState()更新的数据,react 会帮我们执行render()去更新页面,从而将页面中用到 state 中的数据全部更新。
当 render 被调用时,它会检查 this.props 和 this.state 的变化并返回很多类型,很多时候我们选择让该方法返回 React 元素,然后交由 React 去渲染展示:
React 元素:
详细关于 render() 方法的内容请见React.Component - Render)
函数组件是使用 function 来进行定义的函数,只是这个函数会返回和类组件中 render 函数返回一样的内容。
跟类组件相比,函数组件有自己的特点:
我们来定义一个函数组件:
export default function App() {
return <div>xhs rookies</div>
}
在前几篇中, 我们只遇到代表 DOM 标签的 React 元素:
const element = <div />
然而,元素也可以代表用户定义的组件:
const element = <Welcome name="xhs rookies" />
当 React 遇到一个代表用户定义组件的元素时,它将 JSX 属性以一个单独对象的形式传递给相应的组件。 我们将其称为 “props” 对象。
比如, 以下代码在页面上渲染“xhs rookies”:
function Welcome(props) {
return <h1>Hello, {props.name}</h1>
}
const element = <Welcome name="xhs rookies" />
ReactDOM.render(element, document.getElementById('root'))
我们简单解释一下上面这个例子:
注意: 组件名称总是以大写字母开始。
举例来说, <div/> 代表一个 DOM 标签,而 <Welcome/> 则代表一个组件,并且需要在作用域中有一个 Welcome 组件。
你可以深入 JSX阅读更多关于这点背后的原因。
组件可以在它们的输出中引用其它组件。这使得我们可以使用同样的组件来抽象到任意层级。一个按钮,一个表单,一个对话框,一个屏幕:在 React 应用中,所有这些都通常描述为组件。
例如,我们可以创建一个 App 组件,并在其内部多次渲染 Welcome:
function Welcome(props) {
return <h1>Hello, {props.name}</h1>
}
function App() {
return (
<div>
<Welcome name="rookie-Sara" />
<Welcome name="rookie-Cahal" />
<Welcome name="rookie-Edite" />
</div>
)
}
ReactDOM.render(<App />, document.getElementById('root'))
通常,新的 React apps 都有一个单独的顶层 App 组件。然而,如果你在已有的应用中整合 React,你可以需要由下至上地, 从类似于 Button 这样的小组件开始, 逐渐整合到视图层的顶层。
不要害怕把一个组件分为多个更小的组件。
举个例子,思考下名 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>
)
}
它接受 author(一个对象),text(一个字符串)和 date(一个日期)作为 props。
这个组件修改起来很麻烦,因为它是被嵌套的,而且很难复用其中的某个部分。让我们从其中提取一些组件。
首先,提取头像 Avatar:
function Avatar(props) {
return <img className="Avatar" src={props.user.avatarUrl} alt={props.user.name} />
}
Avatar 组件不用关心它在 Comment 中是如何渲染的。这是为什么我们它的 prop 一个更通用的属性名: 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>
)
}
提取组件可能看起来是一个繁琐的工作,但是在大型的 Apps 中可以回报给我们的是大量的可复用组件。一个好的经验准则是如果你 UI 的一部分需要用多次 (Button,Panel,Avatar),或者本身足够复杂(App,FeedStory,Comment),最好的做法是使其成为可复用组件。
无论你用函数或类的方法来声明组件, 它都无法修改其自身 props. 思考下列 sum (求和)函数:
function sum(a, b) {
return a + b
}
这种函数称为 “纯函数” ,因为它们不会试图改变它们的输入,并且对于同样的输入,始终可以得到相同的结果。
反之, 以下是非纯函数, 因为它改变了自身的输入值:
function withdraw(account, amount) {
account.total -= amount
}
虽然 React 很灵活,但是它有一条严格的规则:
注意: 所有 React 组件都必须是纯函数,并禁止修改其自身 props 。
当然, 应用 UI 总是动态的,并且随时有可以改变。
如果我们想要动态改变 UI,那么就会涉及到我们上面说到的state(状态) 。我们通过动态的改变state来渲染整个页面,我们后面会提及,详情见 深入理解 setState
关于React创建和使用组件就介绍到这,上述实例具有一定的参考价值,感兴趣的朋友可以参考学习,希望能对大家有帮助,想要了解更多大家可以关注群英网络其它相关文章。
文本转载自脚本之家
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
测试代码是确保代码稳定的第一步。能做到这一点的最佳方法之一就是使用单元测试。这篇文章主要介绍了如何用JavaScript编写你的第一个单元测试,感兴趣的可以了解一下
这篇文章主要介绍了详解基于element的区间选择组件校验(交易金额),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
canvas有一个非常常用的方法canvas.toDataURL(),它会将canvas转化为data URL的格式。通常情况下这个data URL的类型为image。
图像优化对于网站建设和优化来说,是很重要的一部分,能大大提高网站的性能。对此,本文就给大家来分享一下JPEG/JPG、PNG、WebP这些常见的图片怎样优化,这些图像的应用场景及优缺点?
vue怎么实现打印功能?一些朋友对于打印页面的表格功能的实现比较好奇,因此这篇文章就给大家来分析一下vue实现打印功能实现的方法,下文有示例供大家参考,接下来跟随小编一起看看吧。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008