啦啦啦,上一节咱们知道 react中数据来源有两种:vue
那和vue同样,就要涉及到属性校验了react
react中属性校验:redux
import PropTypes from 'prop-types';
class Count extends Component{
static PropTypes = {
age: PropTypes.Number.isRequired,
gender: PropTypes.oneOf(['男', '女']),
position: PropTypes.shape({
x: PropTypes.Number,
y: PropTypes.Number
}),
hobby: PropTypes.arrayOf(PropTypes.string),
salary(props, propName, componentName){ //自定义校验
if (props[propName] <= 100000){
throw new Error('收益过低')
}
}
}
}
复制代码
有属性校验,那么默认属性怎么写呢?下面示例ide
class Count extends Component{
static defaultProps = {
name: 'xl',
age: 25
}
}
复制代码
接下来就是学习了表单,受控(和状态有关的,相似双向数据绑定)和非受控组件(和状态无关的)学习
<input value={this.state.vale}> //若是你仅仅这样写就会报错
//报错提示给你三个选择:
1) 你能够给默认值 给value改为defaultValue
2) 你真的想用value的话 你必须加onChange属性事件
<input value={this.state.username} name="username" onChange={this.handleChange}>
//username name属性值和状态值名字同样
handleChange = (e) => {
this.setState({
[e.target.name]: e.target.value
})
}
复制代码
上面是受控组件,那非受控组件呢?下面给你演示ui
email = React.creactRef();
<input type="email" name="email" ref = {this.email}/> //取值的时候这样取,this.email.current.value 复制代码
非受控组件的好处是:this
接下来学习组件嵌套以及数据传递(props,Provider/Consumer--跨组件传递)spa
//这是A组件
//A组件是B组件的父组件
<B fn={this.handleClick}/>
//这是B组件
<span onClick={this.handleClick}>B按钮</span>
handleClick = () => {
this.props.fn()
}
复制代码
Provider的用法:code
//前辈组件
// 提供的值必须叫value属性
<Provider value={{r: this.resetClick}}>
<div className="container">
<div className="panel panel-danger">
<div className="panel-heading">
列表点赞
</div>
<div className="panel-body">
<MessageRight lists={this.state.lists} fn={this.handleClick}></MessageRight>
</div>
<div className="panel-footer">
<MessageLeft total={this.state.total}></MessageLeft>
</div>
</div>
</div>
</Provider>
//后辈组件
<Consumer>
{({r})=>{
return <li className="list-group-item">
<h4>{title}</h4>
<button className="btn btn-default" onClick={()=>{
r();
}} >取消</button>
</li>
}}
</Consumer>
复制代码
以上就是react的进一步学习,分享给你们,固然还有不少不足之处但愿你们指出,react基础就是这些了,下一节开始学习redux了!component