javascript - 在计数器函数上使用映射函数
问题描述
我正在尝试使用一个计数器,该计数器被传递一个道具,每次迭代都会递减一个。它通过带有键:值对的假数据服务进行映射。其中一对包括计数属性:124。但是我不断收到此错误:“index.js:1 警告:失败的道具类型:提供给keg
的类型无效的道具,预期的。”array
KegDetail
object
另外,我想实现一种计数器不能变为负数的方法。
这是masterKegList:
import { v4 } from 'uuid';
const masterKegList = [
{
id: v4(),
name: 'Hefeweizen',
brand: 'Widmer',
price: '$140',
alcohol: '5%',
count: 1,
},
{
id: v4(),
name: 'A Little Sumpin Sumpin',
brand: 'Lagunitas',
price: '$160',
alcohol: '7.5%',
count: 124
},
{
id: v4(),
name: 'Chocolate Stout Nitro',
brand: 'Rogue',
price: '$220',
alcohol: '5.8%',
count: 124,
},
{
id: v4(),
name: 'Organic Dry Cider',
brand: 'Avid Cider Co.',
price: '$180',
alcohol: '6%',
count: 124
},
{
id: v4(),
name: 'Vienna Lager',
brand: 'pFriem',
price: '$155',
alcohol: '5.3%',
count: 124
}
];
export function FakeKegList(){
return masterKegList;
}
下面是保持状态的主要组件。
import React from 'react';
import NewKegForm from '../NewKegForm/NewKegForm';
import KegList from "../KegList/KegList";
import KegDetail from "../KegDetail/KegDetail";
import EditKegForm from '../EditKegForm/EditKegForm';
import { FakeKegList } from '../../data/fakeKegService';
import './KegControl.css';
import hefImg from './img/hef.jpg';
import lagunitasImg from './img/lagunitas.jpg';
import rogueImg from './img/rogue.jpg';
import avidImg from './img/avid.jpeg';
import pfriemImg from './img/pfriem.png';
import tapGif from './img/tap.gif';
import pabstImg from './img/pabst.jpg';
import guinnessImg from './img/guinness.jpg';
import pacificoImg from './img/pacifico.jpg';
import Reveal from 'react-reveal/Reveal';
import Button from 'react-bootstrap/Button';
class KegControl extends React.Component {
constructor(props) {
super(props);
this.state = {
formVisibleOnPage: false,
masterKegList: FakeKegList([]),
selectedKeg: null,
editing: false,
};
}
handleClick = () => {
if (this.state.selectedKeg != null) {
this.setState({
formVisibleOnPage: false,
selectedKeg: null,
editing: false
});
} else {
this.setState(prevState => ({
formVisibleOnPage: !prevState.formVisibleOnPage,
}));
}
}
handleAddingNewKegToList = (newKeg) => {
const newMasterKegList = this.state.masterKegList.concat(newKeg);
this.setState({masterKegList: newMasterKegList,
formVisibleOnPage: false
});
}
handleChangingSelectedKeg = (id) => {
const selectedKeg = this.state.masterKegList.filter(keg => keg.id === id)[0];
this.setState({selectedKeg: selectedKeg});
}
handleEditClick = () => {
this.setState({editing: true});
}
handleEditingKegInList = (kegToEdit) => {
const editedMasterKegList = this.state.masterKegList
.filter(keg => keg.id !== this.state.selectedKeg.id)
.concat(kegToEdit);
this.setState({
masterKegList: editedMasterKegList,
editing: false,
selectedKeg: null
});
}
handleDeletingKeg = (id) => {
const newMasterKegList = this.state.masterKegList.filter(keg => keg.id !== id);
this.setState({
masterKegList: newMasterKegList,
selectedKeg: null
});
}
handleDecrementPint = () => {
const sellPint = this.state.masterKegList.map((pint) => {
if (pint.id !== this.state.selectedKeg.id) {
return pint;
}
return {
...pint,
count: pint.count - 1,
// count: pint.count - 1 > 0
// prevents count from going negative but doesn't work because count becomes a boolean value
};
});
console.log(sellPint)
// I tried setting selectedKeg to sellPint to keep user on keg detail page after selling pint, but then I get an error saying keg is an invalid prop type of "object". The number also goes away on keg detail page.
this.setState({ masterKegList: sellPint, editing: false, formVisibleOnPage: true, selectedKeg: sellPint });
}
render(){
let currentlyVisibleState = null;
let buttonText = null;
if (this.state.editing ) {
currentlyVisibleState = <EditKegForm keg = {this.state.selectedKeg} onEditKeg = {this.handleEditingKegInList} onClickingDecrement = {this.handleDecrementPint} onClick={this.handleClick} />
buttonText = "Return to Keg List";
} else if (this.state.selectedKeg != null) {
currentlyVisibleState = <KegDetail keg = {this.state.selectedKeg} onClickingDelete = {this.handleDeletingKeg} onClickingEdit = {this.handleEditClick} onClickingDecrement = {this.handleDecrementPint} />
buttonText = "Return to Keg List";
} else if (this.state.formVisibleOnPage) {
currentlyVisibleState = <NewKegForm onNewKegCreation={this.handleAddingNewKegToList} />;
} else {
currentlyVisibleState =
<KegList kegList={this.state.masterKegList} onKegSelection={this.handleChangingSelectedKeg}/>;
buttonText = "Add Keg";
}
return (
<React.Fragment>
<Reveal>
<div className="container">
{currentlyVisibleState}
<Button variant="primary" onClick={this.handleClick}>{buttonText}</Button>
</div>
</Reveal>
<Reveal>
<div className="row">
<div className="column">
<img alt="" src={lagunitasImg} />
<img alt="" src={pfriemImg} />
<img alt="" src={rogueImg} />
<img alt="" src={tapGif} />
<img alt="" src={hefImg} />
<img alt="" src={avidImg} />
<img alt="" src={tapGif} />
</div>
<div className="column">
<img alt="" src={pabstImg} />
<img alt="" src={guinnessImg} />
<img alt="" src={lagunitasImg} />
<img alt="" src={pacificoImg} />
<img alt="" src={pfriemImg} />
<img alt="" src={pabstImg} />
</div>
<div className="column">
<img alt="" src={lagunitasImg} />
<img alt="" src={pfriemImg} />
<img alt="" src={rogueImg} />
<img alt="" src={tapGif} />
<img alt="" src={hefImg} />
<img alt="" src={avidImg} />
<img alt="" src={tapGif} />
</div>
<div className="column">
<img alt="" src={pabstImg} />
<img alt="" src={guinnessImg} />
<img alt="" src={lagunitasImg} />
<img alt="" src={pacificoImg} />
<img alt="" src={pfriemImg} />
<img alt="" src={pabstImg} />
</div>
</div>
</Reveal>
</React.Fragment>
);
}
}
export default KegControl;
解决方案
修复计数变为负数:
count: Math.max(pint.count - 1, 0)
寻址keg
属性类型
handleChangingSelectedKeg = (id) => {
const selectedKeg = this.state.masterKegList.filter(keg => keg.id === id)[0];
this.setState({selectedKeg: selectedKeg});
}
Array::filter 返回一个数组,但是您将第一个元素弹出以保存在状态中,因此如果该元素被传递给KegDetails
on propkeg
并且它应该是一个对象(相对于数组) ,那么它似乎也是一个数组. 请添加形状,masterKegList
以便我们帮助修复 proptype 不匹配。
推荐阅读
- spring-boot - 通过 Okta 进行身份验证后,会话 cookie 不会发送到 Spring Boot 应用程序
- javascript - React:在对象数组(假数据)上映射以呈现单词数组
- python - 大括号内的 Django 模板大括号
- javascript - 是否可以使用 JavaScript 比较两个 Excel 工作表?
- sql - Oracle 中的隐式数据类型转换
- python - 有没有办法在保持其他维度的同时制作 3D 数组的第二维度的平均值块?
- python - 用谷歌新闻抓取报纸文章标题
- python - 如何查找系列中的所有字符串 - 数据科学
- electron - Electron + Angular:录制时切换麦克风
- c - 在搅拌机的 voronoi.c 文件中,变量 float co[2] 是什么?