如何将回调函数参数传递给父反应组件?

时间:2020-11-05 21:28:49

标签: javascript reactjs apollo

只是想知道将letterSelected传递到useLazyQuery fetchMovies查询中的最佳方法,这样我就不必使用静态变量“ A”。我希望有一种方法可以将其直接传递给fetchMovies。 useLazyQuery是一个阿波罗查询。

const BrowseMovies = () => {

const [fetchMovies, { data, loading}] = useLazyQuery(BROWSE_MOVIES_BY_LETTER, {
    variables: {
        firstLetter: "A"
    }
})

return (
    <div className="browserWrapper">
        <h2>Browse Movies</h2>
        <AlphabetSelect 
            pushLetterToParent={fetchMovies}
        />
        {
            data && !loading &&
            data.browseMovies.map((movie: any) => {
                return (
                    <div className="browseRow">
                        <a className="movieTitle">
                            {movie.name}
                        </a>
                    </div>
                )
            })
        }
    </div>
)
}

export default BrowseMovies

const AlphabetSelect = ({pushLetterToParent}: any) => {

const letters = ['A','B','C','D','E','F','G','H','I','J','K','L', 'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','#']

const [selectedLetter, setSelectedLetter] = useState("A")

const onLetterSelect = (letter: string) => {
    setSelectedLetter(letter.toUpperCase())
    pushLetterToParent(letter.toUpperCase())
}

return (
    <div className="alphabetSelect">
        {
            letters.map((letter: string) => {
                return(
                    <div 
                        className={selectedLetter === letter ? 'letterSelectActive' : 'letterSelect'} 
                        onClick={() => onLetterSelect(letter)}
                    >
                        {letter}
                    </div>
                )
            })
        }
    </div>
)
}
export default AlphabetSelect

1 个答案:

答案 0 :(得分:1)

这似乎是Lifting State Up解决的问题。 useLazyQuery接受gql查询和选项,并返回一个函数以在以后执行查询。听起来好像您希望子组件更新variables配置参数。

浏览电影

  1. 移动firstLetter状态BrowseMovies组件

  2. 从状态更新查询参数/选项/配置

  3. 添加useEffect以在状态更新时触发提取

  4. firstLetter状态和setFirstLetter状态更新程序传递给子组件

    const BrowseMovies = () => {
      const [firstLetter, setFirstLetter] = useState('');
    
      const [fetchMovies, { data, loading}] = useLazyQuery(
        BROWSE_MOVIES_BY_LETTER,
        { variables: { firstLetter } } // <-- pass firstLetter state
      );
    
      useEffect(() => {
        if (firstLetter) {
          fetchMovies(); // <-- invoke fetch on state update
        }
      }, [firstLetter]);
    
      return (
        <div className="browserWrapper">
          <h2>Browse Movies</h2>
          <AlphabetSelect 
            pushLetterToParent={setFirstLetter} // <-- pass state updater
            selectedLetter={firstLetter} // <-- pass state
          />
          {
            data && !loading &&
              data.browseMovies.map((movie: any, index: number) => {
                return (
                  <div key={index} className="browseRow">
                    <a className="movieTitle">
                      {movie.name}
                    </a>
                  </div>
                )
              })
          }
        </div>
      )
    }
    

AlphabetSelect

  1. pushLetterToParent回调附加到div的{​​{1}}处理程序

    onClick