有状态组件
这种组件有自己的state
,可以控制内部状态的变化,也有props
,一般用于处理业务型模块。
class StatefulButton extends React.Component{
state:{
loading:false
}
clickHandle=()=>{
this.setState({loading:true})
}
render(){
const {title} = this.props
const {loading} = this.state
if(loading){
return (<span lassName="loading"></span>)
}
return (<button onClick={()=>{this.clickHandle()}}>{title}</button>)
}
}
-
无状态组件
组件所有状态都通过props
来控制,只提供元素、结构,常用于公用的模块
class StatelessButton extends React.Componet{
render(){
const {loading,title,clickHandle} = this.props
if(loading){
return (<span className="loading"></span>)
}
return (<button onClick={()=>{clickHandle()}}>{title}</button>)
}
}
3. 组件的封装、继承
1. 组件的封装
? 独立一个组件,单独处理它的元素、结构、逻辑,通过create
各种props
去完善组件内部的状态变化,以达到通用的效果。
? 比如:创建一个输入框组件,有默认的状态,支持自定义输入框的外部样式、placeholder
等
class Input extends React.Component{
static defaultProps = {
placeholder:'请输入内容',
type:'text',
}
changeHandle=()=>{
}
render(){
return (<input onChange={(e)=>{this.changeHandle(e)}} {...this.props}></input>)
}
}
当遇到其他场景,比如需要输入框前面添加修饰内容时,可以调整,
class Input extends React.Component{
changeHandle=()=>{
}
render(){
const {sideNode} = this.props
if(sideNode){
return (<span><input onChange={(e)=>{this.changeHandle(e)}} {...this.props}></input></span>)
}
return (<input onChange={(e)=>{this.changeHandle(e)}} {...this.props}></input>)
}
}
2. 组件的继承
创建一个类,该类时另一个类的子类,子类继承了父类所拥有的状态和函数
class ProvideBox extends React.Component {
state = {
color: 'red'
}
clickHandle = () => {
this.setState({color: 'blue'})
}
}
class Box extends ProvideBox {
render() {
return (
<button onClick={this.clickHandle}>
<span style={{color: this.state.color}}></span>
</button>
)
}
}