如何将Redux参数传递给组件?

gxwragnw  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(206)

我正在做一个项目与ReactyReact-Redux
我正在使用一个api,创建一个Search组件来从这个api中获取数据,但是我不知道如何将redux这个词(从搜索的内容中)传递给这个组件。如果我想查找单词“pasta”,我不知道我应该如何传递它。我正在学习如何使用Redux

  • ----还原----
const INITIAL_STATE = {
    search: '',
};

const reducer = (state = INITIAL_STATE, action) => {
    switch (action.type) {
        case SEARCH: return {
            ...state, 
            recipes: action.payload,
        };
        default:
            return {...state}
    }
};

export function getByName(query) {
    return function (dispatch) {
        return axios.get("https://www.themealdb.com/api/json/v1/1/search.php?s="+query).then((response) => {
            dispatch({
                type: SEARCH,
                payload: response.data.meals
            })
        }).catch((error) => console.log(error));
    }
}

---- COMPONENTE SEARCH ---

const [search, setSearch ] = useState('')
    const query = useSelector((state) => state.recipeReducer.search);
    const dispatch = useDispatch();

    useEffect(() => {
        dispatch(getByName(query))
    }, [dispatch]) 

    const handleFilter = e => {
        e.preventDefault();
        setSearch(e.target.value)
        dispatch(getByName(search))
    }

  return (
    <div>
        <form>
            <label>
                Search:
                <input type="text" id="title" placeholder='Search recipe...' value={search} onChange={(e) => handleFilter(e)} />
            </label>
        </form>
    </div>
  )
}
mtb9vblg

mtb9vblg1#

我注意到的一件事是,你初始状态中的“搜索”是多余的,结果才是你对这个玩具问题关心的东西,你应该有:

const INITIAL_STATE = {
    recipes: [],
}

接下来的问题是搜索组件的构造。这个组件定义了你的查询,而不是阅读它。类似这样的东西更像你想要的:

const SearchComponent = ({}) => {
  const [search, setSearch] = useState('')
  const recipes = useSelector((state) => state.recipeReducer.recipes);
  const dispatch = useDispatch();

  const handleFilter = e => {
      e.preventDefault();
      setSearch(e.target.value)
      getByName(search)(dispatch) // getByName returns a function. 
                                  // That function takes dispatch as an argument.
  }

  return (
    <div>
        <form>
            <label>
                Search:
                <input type="text" id="title" placeholder='Search recipe...' value={search} onChange={(e) => handleFilter(e)} />
            </label>
        </form>
    </div>
  );
}

相关问题