Reactjs Redux中的操作创建者给出错误:TypeError:无法读取属性';过滤器';未定义的
我有一份客户名单。添加新客户端时,我希望操作创建者检查客户端名称是否已存在,如果已存在,则显示错误。我正在使用的filter()方法用于确定具有该名称的客户端是否已存在,但该方法不起作用。。。我做错了什么 行动:Reactjs Redux中的操作创建者给出错误:TypeError:无法读取属性';过滤器';未定义的,reactjs,redux,action,reducers,Reactjs,Redux,Action,Reducers,我有一份客户名单。添加新客户端时,我希望操作创建者检查客户端名称是否已存在,如果已存在,则显示错误。我正在使用的filter()方法用于确定具有该名称的客户端是否已存在,但该方法不起作用。。。我做错了什么 行动: export const addClient = (client) => { return(dispatch, getState) => { console.log('state: ' + JSON.stringify(getState()));
export const addClient = (client) => {
return(dispatch, getState) => {
console.log('state: ' + JSON.stringify(getState()));
let clientList = getState().clientList;
console.log('clientList: ' + clientList);
if (clientList && clientList.map( client => {
return client.name;
}).includes(client.name))
{ return ( dispatch({type: 'ADD CLIENT ERROR'}) ) }
else { dispatch({type: 'ADD CLIENT', client}) }
}
}
减速器:
const initState = {
clientList: [],
clientErr: null,
};
const clientReducer = (state = initState, action) => {
switch (action.type) {
case 'ADD CLIENT ERROR':
console.log('add client failed');
return {
...state,
clientErr: 'A client with this exact name already exists, please try again.',
};
default:
return state;
}
};
export default clientReducer;
添加客户机的按钮工作正常,分派被发送到操作,但这就是我得到错误的地方
更改逻辑以查找名称是否存在:
let clientList = getState().clientList
if (clientList && clientList.map( client => {
return client.name;
}).includes(client.name)
)
getState是一个Redux方法,在这里您试图通过点表示法访问对象属性。在这里,您可以按如下方式分解此方法返回的值:
const {
clients: { clientsList },
} = getState();
然后在if语句中对其进行过滤。能否显示操作的console.log(getState)?getState(){if(isDispatching){抛出新错误('在执行减速机时,您不能调用store.getState()。'+'减速机已将状态作为参数接收。'+'Pas…如您在此处看到的getState()是一个方法,而不是一个对象噢!我也可以执行getState().clientList.filter()?您可以从getState()将返回的对象中解构clientList->
const{clientList}=getState();
然后在您的if语句中对其进行过滤我不知道包含()是一个方法,这很酷。但是viciousP在上面帮助我认识到getState实际上是一个方法,getState(),所以我仍然使用它得到错误,map是未定义的。让clientList=getState().clientList;if(clientList&&clientList.map(client=>{return client.name;})。includes(client.name))我刚刚编辑了上面的代码并包含了您的代码段。我不再收到错误,但是错误不会记录。它仍然会添加新客户端,即使已经存在同名的客户端。请参阅console.log输出以查找问题的console.log('state:'+JSON.stringify(getState());让clientList=getState().clientList;console.log('clientList:'+clientList);if(clientList&&clientList.map(client=>{return client.name;}).includes(client.name)){return(dispatch({type:'ADD client ERROR'}))}else{dispatch({type:'ADD client',client})}你应该使用clients.ClientsList这在很大程度上是有效的,但我的代码中有一个bug。当我输入一个客户端名称并添加它时,它会添加客户端。然后,当我背靠背地使用相同的客户端名称时,它仍然会添加它,但是如果我连续第三次这样做,它会说添加客户端失败。因此,它只在sa第三次使用后才有效我的名字被添加了。我想这是因为第一次它添加了名字,但是第二次它的名字===null,所以它没有把它读为已经存在。为什么第二次它是null呢?成功了!希望我能给两个复选标记,但我会给他,因为他给了我更多的代码。但是没有你的代码,我就做不到了,谢谢你u!很高兴听到它正在工作:)希望您在这里学到了一些关于调试的知识