一个组件,它呈现已填好的表单的预览,当您单击左侧的表单时,它会在右侧显示它们。
第一个handleSwitchReview向我抛出了React钩子,所呈现的钩子比上一个呈现错误时要多
第二个不是。当我控制台日志道具,例如,我得到他们4-5次时,第一个函数的视图显示,但没有第二次,第二次只显示1次在控制台日志。
尝试移动setState并在控制台中记录父组件,但这个组件是唯一一个启动了很多次并中断的组件,也许我对如何构造它没有一个明确的理解。
null
const SimpleFormPreview = (props) => {
//Deconstructing Props
const { childAndButtonWithStylesForPreview } = props;
//Setting State
const [child, setChild] = useState({
childToDisplay: childAndButtonWithStylesForPreview ? childAndButtonWithStylesForPreview[0].child : {}
});
//Deconstructing State
const { childToDisplay } = child;
const handleSwitchReview = (childWithIconArr) => {
setChild({ childToDisplay: childWithIconArr.child });
};
const renderPreview = () => {
if (childToDisplay.hasOwnProperty('schema')) {
return <SimpleFormView children={undefined} schema={childToDisplay.schema} onValChange={{}} onSatisfiedOrPercentageChange={{}} vals={{}} existingLookupOriginalVals={{}} nonStandardKeysInPropInfo={{}} satisfiedOverrides={{}} />;
} else {
var reviewItems = _.map(childToDisplay, function (val, key) {
console.log('here', val, key);
if (!key.startsWith('customer') && (key.startsWith('custom') || key.endsWith('Cost'))) {
//skip rendering these
//they will be attached to the main settings rendering below
return null;
} else {
if (key === '_id' || key === 'id') {
return null;
}
var costEl;
var customEl;
_.each(childToDisplay, function (customOrCostVal, customOrCostKey) {
if (customOrCostKey === 'custom' + key) {
customEl = (
<div
style={{
display: 'inline-block',
marginLeft: 5,
color: 'rgb(222, 222, 0)'
}}>
{'Customized to ' + customOrCostVal.toString()}
</div>
);
}
if (customOrCostKey === key + 'Cost') {
costEl = (
<div
style={{
display: 'inline-block',
color: 'rgba(39, 204, 39, 0.52)',
marginRight: 20
}}>
{'+ $' + customOrCostVal.val}
</div>
);
totalAdditionalCost = totalAdditionalCost + customOrCostVal.val;
}
});
return (
<div key={key}>
{costEl}
<div style={{ display: 'inline-block', marginLeft: 5 }}>{key.toString()}</div>:<div style={{ display: 'inline-block', marginLeft: 5 }}>{val.toString()}</div>
{customEl}
</div>
);
}
});
return reviewItems;
}
};
return (
<Grid container direction='column' justify='flex-start' spacing={0}>
<Grid item xs={12}>
<Grid container wrap='wrap' spacing={0}>
<Grid style={{ position: 'fixed', width: 100 }} container direction='column'>
<div style={{ marginLeft: 'auto', height: 447, overflowY: 'scroll', direction: 'rtl', background: 'transparent' }}>
{_.map(childAndButtonWithStylesForPreview, function (childObj, idx) {
var innerIconElText = '';
// if ((idx + 1) > 99) {
// innerIconElText = '...' + (idx + 1)
// } else {
// innerIconElText = idx + 1
// }
if (childObj.iconEl) {
childObj.iconEl.props.style.boxShadow = childToDisplay.id === childObj.child.id ? 'green 0px 0px 33px 5px' : null;
return <div onClick={() => handleSwitchReview(childObj)} key={idx}>{childObj.iconEl}</div>;
} else {
return (
<Button style={{ boxShadow: childToDisplay.id === childObj.child.id ? 'green 0px 0px 33px 5px' : null, height: 100, margin: '25px', borderRadius: 60 }} key={idx} onClick={() => handleSwitchReview(childObj)}>
<span id='defaultChildIcon' style={{ position: 'relative' }}></span>
<span style={{ marginLeft: 22, marginTop: 10, fontSize: 12, position: 'absolute' }}>{innerIconElText}</span>
</Button>
);
}
})}
</div>
</Grid>
<Grid id={'simpleForm'} style={{ height: '100%', width: '100%', overflow: 'auto' }} container>
<Paper style={{ marginTop: '25px', marginLeft: '165px', padding: '15px', width: '80%' }} elevation={24}>
hello
<div style={{ float: 'right' }}>
<Button id='localSaveBtn' onClick={() => handleSave(document.querySelector('#simpleForm'))} variant='contained' color='secondary' size='large' style={{}}>
Save File
</Button>
</div>
</Paper>
</Grid>
</Grid>
</Grid>
</Grid>
);
};
export default SimpleFormPreview;
null
直接在if语句“if(ChildObj.Iconel)”之后修改道具导致应用程序重复地重新呈现。
使用cloneElement我可以使我的元素将原始元素的道具与新的道具简单地合并在一起:reactjs.org/docs/react-api.html#cloneElement错误停止了,我可以实现所需的结果,即更改作为道具向下传递给子元素的按钮的方框阴影onClick。
下面是替换“if(ChildObj.Iconel)”if条件后的行的代码。
null
var clonedElementWithInjectedStyles = React.cloneElement(childObj.iconEl, { style: { ...childObj.iconEl.props.style, boxShadow: childToDisplay.id === childObj.child.id ? 'green 0px 0px 33px 5px' : null } });
return (
<div onClick={() => handleSwitchReview(childObj)} key={idx}>
{clonedElementWithInjectedStyles}
</div>
);
我有一个组件,我在其中调用我的自定义钩子。 自定义钩子如下所示: 而我在其中使用的导致错误的组件是: 有什么想法吗?
我目前正在实现useSWR,以便从我的express和mongo-db后端获取数据。我能够顺利地从数据库中提取数据没有问题。下面是我用来实现这一点的代码: 然后通过以下方式访问: ,其中username是集合中的一个字段。 当我尝试将此信息添加到状态钩子中时,问题就出现了,然后状态钩子返回的错误呈现的钩子比上一次呈现的钩子要多。 删除行:和使用状态变量displayNumber的任何行就可以完全修
我有一个组件看起来是这样的(非常简化的版本): 加载使用此组件的页面时,出现以下错误:我试图找到此错误的解释,但搜索未返回任何结果。 当我稍微修改组件时: 我再也不知道那个错误了。是因为我在由返回的jsx中包含了函数吗?如果能有一个解释为什么修复是有效的,那就太好了。
我正在使用 React 的钩子,我希望有一个从数据库中检索到的值作为初始值。但是,我收到以下错误: 不变冲突:不变冲突:与上一次渲染相比,渲染的钩子更多。 我用的是反应阿波罗钩。 更新
我能用钩子解决这个问题吗? 为什么它不能正常工作? 我开始使用REACT DND,在我尝试使用拖放后,所有的事情都出了问题。 我将其用作依赖项: > “@testing-library/jest-dom”:“^4.2.4”, "@testing-library/react":"^9.5.0", 已部署项目-hunger-tree.surge.sh src/components/todos/crea
我需要创建一个React应用程序,让你列出口袋妖怪和类型。我从PokeAPI获取数据。从应用程序组件获取数据然后将其传递给子组件是一种好的做法,还是从子组件获取数据更好? 我在主应用程序中获取它,我可以看到获取工作,因为我需要控制台。记录数据,但是我的组件没有得到它,因此我得到了一个道具。map不是中的函数。 这是我的应用程序。js: 这是我的口袋妖怪列表。js: 最后一个是我的PokeCard。