Reactjs Useffect钩子内部不包含点火功能
我的reactjs应用程序中有以下组件:Reactjs Useffect钩子内部不包含点火功能,reactjs,react-redux,react-hooks,redux-thunk,use-effect,Reactjs,React Redux,React Hooks,Redux Thunk,Use Effect,我的reactjs应用程序中有以下组件: import React, { useEffect } from 'react'; import { Helmet } from 'react-helmet'; import { connect } from 'react-redux'; import MovieList from '../components/MovieList'; import styled from 'styled-components'; import { getMovi
import React, { useEffect } from 'react';
import { Helmet } from 'react-helmet';
import { connect } from 'react-redux';
import MovieList from '../components/MovieList';
import styled from 'styled-components';
import { getMoviesDiscover} from '../actions';
const Wrapper = styled.div`
display: flex;
width:100%;
flex-direction: column;
`;
const Discover = ({
geral,
movies
}) => {
const query = 'popular';
useEffect( () => {
getMoviesDiscover( query );
} , [] );
if( movies.loading ) {
return (
<div>
Movies are loading..
</div>
)
}
return (
<Wrapper>
<Helmet>
<title>Danm Gurl</title>
</Helmet>
<MovieList
movies={ movies }
/>
<MovieList
movies={ movies }
/>
</Wrapper>
)
}
const mapStateToProps = ({ geral, movies }) => {
return { geral, movies };
};
export default connect(
mapStateToProps,
{ getMoviesDiscover }
)(Discover);
问题是如果我在
useffect
中添加了console.log,我会在控制台中看到console.log。但是函数getMoviesDiscover
从未执行过。getMoviesDiscover函数位于外部文件中,如下所示:
export const getMoviesDiscover = ( name , page ) => async ( dispatch , getState ) => {
console.log('OK !')
dispatch({ type : 'FETCH_MOVIES_LOADING' })
const res = await tmdbAPI.get(`https://api.themoviedb.org/3/movie/${name}?api_key=<MY_API_KEY>` , {
params: {
page
}
});
await dispatch({
type: 'FETCH_MOVIES_DISCOVER',
payload: res.data
});
dispatch({ type : 'FETCH_MOVIES_FINISHED' })
}
export const getMoviesDiscover=(名称,页面)=>async(调度,getState)=>{
console.log('OK!')
分派({type:'FETCH\u MOVIES\u LOADING'})
const res=wait tmdbAPI.get(`https://api.themoviedb.org/3/movie/${name}?api_key=`{
参数:{
页
}
});
待命({
键入:“获取电影\u发现”,
有效载荷:res.data
});
分派({type:'FETCH_MOVIES_FINISHED'})
}
为什么我的useEffect钩子没有调用该函数?现在发生的事情是,直接调用从“../actions”导入的(thunk)函数
getMoviesDiscover
,而不是传递到mapDispatchToProps
的函数。所以你需要在你的道具中解构这个函数,例如。
({
杰拉尔,
电影,,
getMoviesDiscover
}) => {
您可能还需要执行
getMoviesDiscover as myNewFuncName
,以避免阴影变量错误,因此现在发生的是导入(thunk)直接调用来自“../actions”的函数getMoviesDiscover
,而不是传递到mapDispatchToProps
的函数。因此,您需要在您的道具中分解此函数,例如。
({
杰拉尔,
电影,,
getMoviesDiscover
}) => {
您可能还需要执行
getMoviesDiscover as myNewFuncName
以避免阴影变量错误getMoviesDiscover
看起来是一个curried函数,您只需向它传递name
参数,它将返回您尚未调用的实际异步函数。也许您仍然需要调用一个调用,som例如getMoviesDiscover('popular')()
@DrewReese是正确的。我认为这里的主要问题是您没有以正确的方式绑定getMoviesDiscover
操作。尝试将其添加到组件的道具中。如果没有帮助,请尝试显式创建一个mapDispatchToProps
函数,该函数使用getMoviesDiscover
上使用的bindActionCreators
e> 动作并将其传递给connect
getMoviesDiscover
看起来是一个常用函数,您只需将name
参数传递给它,它将返回您尚未调用的实际异步函数。也许您仍然需要调用,类似于getMoviesDiscover('popular')()
@DrewReese是正确的。我认为这里的主要问题是您没有以正确的方式绑定getMoviesDiscover
操作。尝试将其添加到组件的道具中。如果没有帮助,请尝试显式创建一个mapDispatchToProps
函数,该函数使用getMoviesDiscover
上使用的bindActionCreators
e> 操作并将其传递给connect
export const getMoviesDiscover = ( name , page ) => async ( dispatch , getState ) => {
console.log('OK !')
dispatch({ type : 'FETCH_MOVIES_LOADING' })
const res = await tmdbAPI.get(`https://api.themoviedb.org/3/movie/${name}?api_key=<MY_API_KEY>` , {
params: {
page
}
});
await dispatch({
type: 'FETCH_MOVIES_DISCOVER',
payload: res.data
});
dispatch({ type : 'FETCH_MOVIES_FINISHED' })
}