将状态共享给其他组件 |将数据传递给其他组件

Posted

技术标签:

【中文标题】将状态共享给其他组件 |将数据传递给其他组件【英文标题】:Share State to other component | pass data to other component 【发布时间】:2021-08-15 11:33:58 【问题描述】:

你好,我目前正在学习 React,我对如何将数据或状态传递给另一个组件感到困惑

我有这样的搜索组件

function Search(props) 
  const [ query, setQuery ] = useState("")
  const [ movie, setMovie ] = useState()

  function searchHandler() 

    axios.get(`$api.urlSearchMovie/$api.key/$query`)
    .then(res => 
      setMovie(res.data.results)
    ).catch(err => 
      console.log(err)
    )

  

  return (
    <div className="search-input">
        <div class="input-group input-custom mb-3">
          <input
            type="text"
            class="form-control"
            placeholder="Search Movie"
            onChange=e => setQuery(e.target.value)
            value=query
          />
          <button
            class="btn btn-outline-primary"
            onClick=searchHandler
          >
            Search
          </button>
        </div>
    </div>
  );


export default Search;

还有这样的 MainPage 组件

function MainPage() 

  return (
    <div>
      <Navbar />
      <div className="container">
        <Search />
        <hr />
        <div className="content">
          <div className="row">
            <div className="col-4">
              <Card
                image="https://dbkpop.com/wp-content/uploads/2020/06/weeekly_we_are_teaser_2_monday.jpg"
                title="Monday"
                description="Monday Weeekly Member"
              />
            </div>
            <div className="col-4">
              <Card
                image="https://dbkpop.com/wp-content/uploads/2020/06/weeekly_we_are_teaser_2_monday.jpg"
                title="Monday"
                description="Monday Weeekly Member"
              />
            </div>
            <div className="col-4">
              <Card
                image="https://dbkpop.com/wp-content/uploads/2020/06/weeekly_we_are_teaser_2_monday.jpg"
                title="Monday"
                description="Monday Weeekly Member"
              />
            </div>
          </div>
        </div>
      </div>
    </div>
  );


export default MainPage;

问题是,如何将状态(电影)从搜索组件传递到主页面组件。这样我就可以将数据呈现给 MainPage 组件

【问题讨论】:

【参考方案1】:

Data in React flows down,所以你需要lift the state up。

因此,movie 状态应该在MainPage 的范围内:

function MainPage() 
  const [ movie, setMovie ] = useState()
  
  // Set query results with setMovie
  return <Search setMovie=setMovie ... />


function Search(props) 

  function searchHandler() 
    axios.get(`$api.urlSearchMovie/$api.key/$query`)
    .then(res => 
      props.setMovie(res.data.results)
    ).catch(err => 
      console.log(err)
    )
  

  return (...);


export default Search;

【讨论】:

哇,谢谢你的回答。我认为组件之间共享状态只能使用Context

以上是关于将状态共享给其他组件 |将数据传递给其他组件的主要内容,如果未能解决你的问题,请参考以下文章

将数据传递给另一个组件[重复]

使用反应钩子将数据传递给兄弟组件?

Vue路由器:如何将数据传递给链接到的组件?

Vue:将数据传递给动态组件

如何将数据传递给 vue.js 中的子组件

如何将数据传递给嵌套的子组件vue js?