版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
react基础学习(二)组件通信
-
父传子
通过在父组件的标签中添加属性传递,
<List data={this.state.list}/>
子组件通过 props获取
this.props.data
-
子传父,通过事件传参
在父组件上定义一个方法。传递到子组件
Dellist =(id) =>{ this.setState({ Todolist: this.state.Todolist.filter(item =>item.id !==id) }) } <Todoitem Dellist = {this.Dellist} /> </div>
子组件通过props获取到父组件上的方法在自己的方法中调用
handelClick = () =>{ this.props.Dellist(this.props.id) } <button className="button is-danger is-small" onClick={this.handelClick}>删除</button>
组件内部的数据state
// state是组件的内部状态 state的第一种写法 state = { // list: [1, 2, 3, 4, 5] // } constructor() { super() // state的第二种写法, 但是得注意,这种写法必须在super()之后 this.state = { list: [1, 2, 3, 4, 5] } console.log('constructor只会执行一次,所以推荐在这里来进行bind(this)') this.handleAddRandomThree = this.handleAddRandomThree.bind(this) } / react里更改state不能直接更改,这样更改的话,只有数据会变化,但是界面并不会根据数据的变化而变化 列// this.state.list.push(Math.random()) 必须得用setState()方法 // setState有两个参数,第一个参数可以是一个对象 this.setState({ list: this.state.list.concat(Math.random()) }) } handleAddRandomTwo = () => { const list = [...this.state.list] list.push(Math.random()) // 也可以是一个方法去return一个对象, 这样做的好处是,可以在这个方法里有一个参数,是上一次的state // 因为setState是异步的, 所以setState还有第二个参数,也是一个方法, 就是setState之后的回调函数 this.setState((prevState) => { console.log('prevState:', prevState) return { list } }, () => { // 这里得到的 this.state才是最新的state console.log('回调里的this.state:', this.state) }) console.warn('setState外面的this.state:', this.state) }
props类型验证(是从react中剥离出去的一个包,用于检查props的类型)
npm i prop-types -S
引入:import PropTypes from ‘prop-types’
使用方法,在子组中引入,在实例上添加
static propTypes= {
todos:PropTypes.arrayOf(PropTypes.shape({
id:PropTypes.number.isRequired,
text:PropTypes.string.isRequired
})).isRequired
}
}
DefaultProps 定义默认值当不传值时,以默认值为准
static defaulttProps = {
addItem: ()=>{}
}
/ 函数式组件的defaultProps写法
const TodoHeader = (props) => {
return (
<div>
<h1>{props.children}</h1>
<p>{props.subtitle}</p>
</div>
)
}
// 使用箭头函数创建的组件,就要先定义一个组件,再使用下面的方式来创建默认的props
TodoHeader.defaultProps = {
children: '待办事项列表',
subtitle: '今日事,今日毕,不知有没有明天'
}
// 使用箭头函数创建的组件,就要先定义一个组件,再使用下面的方式来写propTypes
TodoHeader.propTypes = {
subtitle: PropTypes.string
}
export default TodoHeader
<Fragment> react中代表空标签用于包裹
{/* 组件的子元素可以在组件内部通过props.children来获取 */}
<TodoHeader>TODO LIST</TodoHeader>
<TodoInput
/>
</Fragment>
绑定事件并传递参数
第一种方法
1, 使用箭头函数包裹一层去调用用一个函数此时不用bind this
//第一种方法,使用箭头函数
export default class App extends Comment{
handleClick(id){
console.log(this);
console.log(id);
}
render(){
return{
<div>
<button onClick={
()=>{
this.handleClick(123)
}
}>点击</button>
</div>
}
}
}
第二种方法
直接绑定事件,使用bind(this,params)
//第二种方法 使用bind(this, params)
export default class App extends Comment{
handleClick(id){
console.log(this);
console.log(id);
}
render(){
return{
<div>
<button onClick={
this.handleClick.bind(this,123)
}>点击</button>
</div>
}
}
}
第三种方法作为子组件的方式(推荐使用)
//第三种方法 子组件的方式
class Button extends Component{
handleClick=()=>{
this.props.onClick(123)
}
render(){
return(
<button onClick={
this.handleClick
}>点击</button>
)
}
}
export default class App extends Component{
handleClick(id){
console.log(this);
console.log(id);
}
render(){
return{
<div>
<Button onClick={
this.handleClick
}/>
}
}
}