【问题标题】:how to make parent component pass prop to children only when button is clicked仅当单击按钮时,如何使父组件将道具传递给子组件
【发布时间】:2019-02-09 17:29:18
【问题描述】:

我只想在 AddPost 中单击按钮时将道具从 AddPost 组件传递给 AllPosts 组件。

加上每次单击按钮时如何继续从 AddPost 中的对象“newArray”中添加新帖子的数据(帖子,标题,keyid),并且这些新数据保存在 allposts 数组中,然后显示每个帖子通过在其上应用地图功能。

我面临的问题是如何从 newObject 中的 AddPost 获取新数据并不断将其推送到 allposts 数组中?

AddPost.js

class Addpost extends Component {
    constructor(props) {
        super(props);
        this.state = {  
          title : '',
          post : '',
          keyid : 0
        }
        this.handleClick = this.handleClick.bind(this);
        this.handleChange = this.handleChange.bind(this);
     }

    handleChange(event) {
      this.setState({
        [event.target.name] : event.target.value
      })
    }

    handleClick() {
        this.setState(prevState => ({   
         keyid : prevState.keyid + 1,
         post : '',
         title : ''
    }));
         console.log(this.state.keyid);
    }

    render() {
        return(
            <div>
                <input type="text" name="title" value={this.state.title} onChange={this.handleChange} maxLength="30" placeholder="Title here" />
                <input type="text" name="post" value={this.state.post} onChange={this.handleChange} maxLength="200" placeholder="Post here" />
                <input type="button" onClick={this.handleClick} value="Add Post" /> 
                <Allposts post={this.state.post} title={this.state.title} keyid={this.state.keyid} /> 
            </div>
            )
        }    
    }

AllPosts.js

class Allposts extends Component {
constructor(props) {
  super();
this.state = {
  newObject : {
    post : '',
    title : '',
    keyid : ''
  },
  allPosts : []
}

}

render() {
        return (
          this.state.allPosts.map((post) =><div>
          { post.post}{post.title}{post.keyid}
          </div>
)
          )
    }    
}

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    解决问题的更好方法是保持 AllPosts 和 Addpost 组件由它们的组件 Parent 隔离和呈现

    post.js

    class Post extends React.Component {
       state: {
          allPosts: []
       }
       addPost = (post) => {
          this.setState(prev => ({allPosts: prev.allPosts.concat([post])}))
       }
       render() {
          <>
             <Addpost addPost={this.addPost}/>
             <AllPosts allPosts={this.state.allPosts} />
          </>
       }
    }
    

    Addpost.js

    class Addpost extends Component {
        constructor(props) {
            super(props);
            this.state = {  
              title : '',
              post : '',
              keyid : 0
            }
            this.handleClick = this.handleClick.bind(this);
            this.handleChange = this.handleChange.bind(this);
         }
    
        handleChange(event) {
          this.setState({
            [event.target.name] : event.target.value
          })
        }
    
        handleClick() {
            const { keyid, post, title } = this.state;
            const post = { keyid, post, title };
            this.props.addPost(post)
            this.setState(prevState => ({   
                keyid : prevState.keyid + 1,
                post : '',
                title : ''
            }));
        }
    
        render() {
            return(
                <div>
                    <input type="text" name="title" value={this.state.title} onChange={this.handleChange} maxLength="30" placeholder="Title here" />
                    <input type="text" name="post" value={this.state.post} onChange={this.handleChange} maxLength="200" placeholder="Post here" />
                    <input type="button" onClick={this.handleClick} value="Add Post" />  
                </div>
            )
         }    
    }
    

    Allposts.js

    const Allposts = () => {
       return (
            this.props.allPosts.map((post) => (
               <div>
                { post.post} {post.title} {post.keyid}
               </div>
            ))
       )   
    }
    

    但是,如果您只想在单击后传递道具,则需要保持一个状态,即是否单击。然后传递 props 像

    const { clicked, post, keyid, title } = this.state;
    const newProp = { post, keyid, title };
    
    <AllPost {...(clicked? newProps: {})} />
    

    【讨论】:

    • 关于单击按钮时传递道具的答案部分,它会发生一次,因为单击状态将在第一次单击按钮时设置为 true。但是我要如何再次将其设置为 false,以便在每次单击按钮后,将输入字段中的数据发送到其他组件。因此在点击之间,props 被保存在它自己的组件中。
    • @Alternatingpulse 我个人会建议您使用第一种方法,因为这是设计系统的正确方法,但您始终可以在 setState 回调中清除状态。
    猜你喜欢
    • 1970-01-01
    • 2019-06-13
    • 2021-06-11
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    相关资源
    最近更新 更多