方式一:通过props传递(只能父子之间传值)
1.共同的数据放在父组件上,特有的数据放在自己组件内部(state)
2.通过props可以传递一般数据和函数数据,只能一层一层传递
3.一般数据--->父组件传递数据给子组件--->子组件读取数据
4.函数数据--->子组件传递数据给父组件--->子组件调用函数
方式二:使用消息订阅(subscribe)-发布(publish)机制
1.工具库:PubSubJS
2.下载:npm install pubsub --save
在使用PubSub之前是使用props传递的:祖组件<--->父组件<--->子组件
祖组件:
import React,{Component} from 'react'
import CommentAdd from '../comment-add/comment-add'
import CommentList from '../comment-list/comment-list'
import '../../../main.css'
export default class App extends Component{
state={
comments:[
{username:'tom',content:'reactr'},
{username:'jack',content:'qweq'},
]
}
deleteComment = (index) => {
const {comments} = this.state
comments.splice(index,1)
this.setState({comments})
}
render(){
const {comments}=this.state
return(
<div>
<h1 className="title">TITLE,TITLE,TITLE</h1>
<CommentAdd/>
<CommentList comments={comments} deleteComment={this.deleteComment}/>
// 传递参数 传递方法
</div>
)
}
}
父组件:
import React,{Component} from 'react'
import PropTypes from '_prop-types@15.7.2@prop-types'
import CommentItem from '../comment-item/comment-item'
export default class CommentList extends Component{
static propTypes={//接收并定义类型和限制
comments:PropTypes.array.isRequired,
deleteComment:PropTypes.func.isRequired
}
render(){
const {comments,deleteComment}=this.props
const display = comments.length==0?'block':'none'
return(
<div className="commentList">
<h3>评论回复:</h3>
<h4 style={{display}}>贺岁档和附件三</h4>
<ul>
{comments.map((comment,index) => <CommentItem comment={comment} key={index} deleteComment={deleteComment} index={index}/>)}
// 再次传递方法
</ul>
</div>
)
}
}
子组件:
import React,{Component} from 'react'
import PropTypes from 'prop-types'
export default class CommentItem extends Component{
static propTypes = {//接收参数和方法,定义类型和限制
comment:PropTypes.object.isRequired,
deleteComment:PropTypes.func.isRequired,
index:PropTypes.number.isRequired
}
handleDelete = () => {
const {comment,deleteComment,index} = this.props
//提示
if(window.confirm(`确定删除${comment.username}的评论吗?`)){
//确定后删除
deleteComment(index)
// 调用
}
}
render(){
const {comment} = this.props
return(
<li>
<div className="commentItem">
<p>{comment.username}:</p>
<p>{comment.content}</p>
<button onClick={this.handleDelete}>delete</button>
</div>
</li>
)
}
}
使用PubSubJS传递:
子组件:
import React,{Component} from 'react'
import PropTypes from 'prop-types'
import PubSub from 'pubsub-js'
export default class CommentItem extends Component{
static propTypes = {
comment:PropTypes.object.isRequired,
index:PropTypes.number.isRequired
}
handleDelete = () => {
const {comment,index} = this.props
//提示
if(window.confirm(`确定删除${comment.username}的评论吗?`)){
//确定后删除
//发布消息(一个叫delete的方法),index是要传的参数
PubSub.publish('delete',index)
}
}
render(){
const {comment} = this.props
return(
<li>
<div className="commentItem">
<p>{comment.username}:</p>
<p>{comment.content}</p>
<button onClick={this.handleDelete}>delete</button>
</div>
</li>
)
}
}
祖组件:
import React,{Component} from 'react'
import PubSub from 'pubsub-js'
import CommentAdd from '../comment-add/comment-add'
import CommentList from '../comment-list/comment-list'
import '../../../main.css'
export default class App extends Component{
state={
comments:[
{username:'tom',content:'reactreactreactreactreactreact'},
{username:'jack',content:'qweqweqweqweqweqwe'},
]
}
componentDidMount() {
//订阅一个叫delete的消息
PubSub.subscribe('delete',(msg,index) => {
this.deleteComment(index)
})
}
addComment = (comment) => {
//获取
const {comments} = this.state
//修改
comments.unshift(comment)/**/
//状态更新
this.setState({comments})
}
deleteComment = (index) => {
//获取
const {comments} = this.state
//删除
comments.splice(index,1)
//状态更新
this.setState({comments})
}
render(){
const {comments}=this.state
return(
<div>
<h1 className="title">TITLE,TITLE,TITLE</h1>
<CommentAdd addComment={this.addComment}/>
<CommentList comments={comments}/>
</div>
)
}
}
方式三:redux(重点哦)
先略过