【发布时间】:2021-03-07 04:23:24
【问题描述】:
我在我正在工作的项目中有这个页面,它加载保存在我的 mongodb 中的所有计划名称,并且还将加载与用户选择的名称相关联的所有值。现在它可以正常工作并且没有任何问题,但是我在页面上遇到了我不知道如何修复的错误。
我将整个页面包含在内,以便您查看发生了什么:
interface Props {
isVisible: boolean,
closeDialog: () => void
}
export function LoadDialog({ isVisible, closeDialog }: Props) {
const uiActor: Actor = React.useContext(uiActorContext);
const [highlightedPlan, setHighlightedPlan] = React.useState('');
const [loadedPlans, setLoadedPlans] = React.useState([]);
const [isLoading, setLoading] = React.useState(false);
const [error, setError] = React.useState('');
React.useEffect(() => {
if (!isVisible) {
setHighlightedPlan('');
setError('');
setLoading(false);
} else {
(async () => {
const { response, rooms } = await uiActor.sendMessage(ActorId.Network, MessageId.LoadAllPlan, undefined);
switch (response) {
case ApiResponse.Database:
setError('There was a problem connecting to the database');
break;
case ApiResponse.Success:
setLoadedPlans(rooms);
break;
default:
break;
}
})();
}
}, [isVisible]);
const handleLoadClick = React.useCallback(async () => {
if (highlightedPlan === '') {
setError('Please select a plan from the list');
return;
}
setLoading(true);
const planData = await uiActor.sendMessage(ActorId.Network, MessageId.LoadPlan, highlightedPlan);
const response = await uiActor.sendMessage(ActorId.Main, MessageId.CreateLoadedPlan, planData);
switch (response) {
case ApiResponse.Database:
setError('There was a problem connecting to the database');
break;
case ApiResponse.Success:
closeDialog();
break;
default:
break;
}
}, [highlightedPlan]);
const handleRemoveClick = React.useCallback(async () => {
if (highlightedPlan === '') {
setError('Please select a plan from the list');
return;
}
setLoading(true);
const response = await uiActor.sendMessage(ActorId.Network, MessageId.RemovePlan, highlightedPlan);
switch (response) {
case ApiResponse.Database:
setError('There was a problem connecting to the database');
break;
case ApiResponse.Success:
setLoadedPlans((plans) => {
const newPlans = plans.filter((element) => element.id !== highlightedPlan);
setHighlightedPlan(newPlans.length ? newPlans[0].id : '');
return newPlans;
});
setLoading(false);
setError('');
break;
default:
break;
}
}, [highlightedPlan]);
const handlePlanChange = React.useCallback((event) => {
setHighlightedPlan(event.target.value);
}, []);
return isVisible ? (
<Dialog>
<div className='card-body'>
<h5 className='card-title'>Load Plan</h5>
<form method='post' onSubmit={(event) => event.preventDefault()}>
<div className='form-group'>
<ExtendLabel htmlFor='nameElement'>
Select the plan you want
<select
disabled={isLoading}
defaultValue=''
onChange={(event) => handlePlanChange(event)}
className={`form-control${error !== '' ? ' is-invalid' : ''}`}
id='nameElement'
>
<option value='' disabled>Select a plan</option>
{loadedPlans.map(({ id, name }) => <option key={id} value={id}>{name}</option>)}
</select>
<div className='invalid-feedback'>{error}</div>
</ExtendLabel>
</div>
<div className='btn-group mr-2'>
<Button type='submit' onClick={() => handleLoadClick()} disabled={isLoading}>Load Plan</Button>
<Button className='secondary' onClick={() => handleRemoveClick()} disabled={isLoading}>Remove Plan</Button>
</div>
<Button className='danger ml-2' onClick={() => closeDialog()} disabled={isLoading}>Cancel</Button>
</form>
</div>
</Dialog>
) : null;
}
我得到的错误在这里:
setLoadedPlans(房间);
错误 - TS2345: 类型参数 '{ id: string;名称:字符串; }[]' 不可分配给“SetStateAction
还有:
const newPlans = plans.filter((element) => element.id !== highlightPlan); setHighlightedPlan(newPlans.length ? newPlans[0].id : '');
错误 - TS2339:“从不”类型上不存在属性“id”。
我看到其他人对这种类型的事情有问题,并将其归为编译器的问题,但想检查这里是否是这种情况,或者是否有什么我应该改变的?
编辑:
所以我为以下内容分配了一个类型: const { response, rooms }: any = await uiActor.sendMessage(ActorId.Network, MessageId.LoadAllPlan, undefined);
setLoadedPlans((计划:任何) => { const newPlans = plans.filter((element: any) => element.id !== highlightPlan);
这将消除错误,但这是不好的做法吗? 谢谢
【问题讨论】:
-
请不要简单地将您的错误转储到stackoverflow,想出某种简化的问题重现,并详细说明您不明白的地方。此外,添加一些游乐场/沙盒链接始终是一个好习惯。
-
嗯,我不知道还能怎么说?认为这很清楚,我不确定为什么我的代码会出现这些错误。如果代码按预期工作,为什么会出现这些错误?
-
在添加游乐场方面,不确定是否可以这样做,此文件链接到其他一些文件,不同的演员在这里发挥作用,以便从 mongodb 获得所需的内容
-
是的,这就是我提到简化复制的原因。找出在什么情况下会发生实际错误并进行沙箱复制。会有很大帮助的。
-
不可能是真的,代码中的每个函数 sn-p 都是出现错误所必需的
标签: reactjs typescript