Javascript 如何从状态中删除位于对象数组中的对象
我正在尝试按id从对象中的数组中删除对象。我不知道如何执行此操作…我看过其他几篇文章,但我觉得设置有点不同,所以我仍然无法理解Javascript 如何从状态中删除位于对象数组中的对象,javascript,arrays,reactjs,nested,javascript-objects,Javascript,Arrays,Reactjs,Nested,Javascript Objects,我正在尝试按id从对象中的数组中删除对象。我不知道如何执行此操作…我看过其他几篇文章,但我觉得设置有点不同,所以我仍然无法理解 deleteFounds即使我正在获取正确的用餐id,也不会删除正确的对象。“星期一”也作为占位符/试图解决问题 我以前的商店设置不同,每个用餐对象都有自己的日期键,我可以删除,但第一个对象(id:1)直到最后一个才删除。我最终重构了商店,使每个用餐对象都位于一个由实际日期分隔的数组中 所以现在我需要两个问题的帮助 如何正确删除已设置的my store对象 为什么正餐不
deleteFounds
即使我正在获取正确的用餐id,也不会删除正确的对象。“星期一”也作为占位符/试图解决问题
我以前的商店设置不同,每个用餐对象都有自己的日期
键,我可以删除,但第一个对象(id:1)直到最后一个才删除。我最终重构了商店,使每个用餐对象都位于一个由实际日期分隔的数组中
所以现在我需要两个问题的帮助
如何正确删除已设置的my store对象
为什么正餐不会删除
App.js中的deletemine
deleteMeal = (day, mealId) => {
this.setState(prevState => ({
// copy existing state
...prevState,
// update meals key
meals: {
// copy existing meals state
...prevState.meals,
// update day key & filter meals array by id
[day]: prevState.meals[day].filter( ({ id }) => id !== mealId),
}
}));
}
const contextValue = {
recipes: this.state.recipes,
meals: this.state.meals,
addRecipe: this.addRecipe,
deleteRecipe: this.deleteRecipe,
updateRecipe: this.updateRecipe,
addMeal: this.addMeal,
deleteMeal: this.deleteMeal
}
天数部分
class Days extends React.Component{
render() {
const { day, meals } = this.props
let mealsList;
if (meals[day]) {
mealsList = meals[day]
.map((meal, key) =>
<Meals
key={key}
day={day}
meal={meal}
/>
)
}
return(
<div className="Days">
<h3>{day}</h3>
{meals && meals[day] && mealsList}
</div>
)
}
}
class Meals extends React.Component {
static contextType = StashContext;
state = {
recipeTitle: 'No Title',
recipeImageUrl: '',
showModal: false
}
findRecipe = (recipeId, recipes) => {
const recipe = recipes.find( recipe => recipe.id == recipeId)
if (recipe) {
this.setState({
recipeTitle: recipe.title,
recipeImageUrl: recipe.image_url
})
}
}
componentDidMount() {
const { recipes } = this.context
const { meal } = this.props
this.findRecipe(meal.recipe_id, recipes)
}
handleClickDelete = (event) => {
const { day, meal } = this.props
const { id } = meal
event.preventDefault()
this.context.deleteMeal(day, id)
}
toggleModal = () => {
this.setState({
showModal: !this.state.showModal
})
}
render(){
const { recipeTitle, recipeImageUrl, showModal } = this.state;
const { meal } = this.props;
const customStyles = {
overlay: {
background: '#4c645682'
},
content: {
background: 'rgb(240 240 240)'
}
}
const permissions = {
edit: false,
add: false,
delete: false
}
return (
<div className="Meals">
{showModal &&
<DisplayModal
meal={meal}
customStyles={customStyles}
showModal={showModal}
closeModal={this.toggleModal}
label="Meal Modal"
permissions={permissions}
/>
}
<div className="Meals__info">
<div className="info_box left">
<div className="Meals__img">
<img src={recipeImageUrl} alt="Placeholder" />
</div>
</div>
<div className="info_box middle">
<div className="Meals__recipe-title">
{recipeTitle}
</div>
</div>
<div className="info_box right">
<div className="Meals__options">
<FontAwesomeIcon
icon={faEye}
onClick={e => {this.setState({showModal: true})}} />
<FontAwesomeIcon
icon={faBackspace}
onClick={this.handleClickDelete} />
</div>
</div>
</div>
</div>
)
}
}
export default Meals
上课时间延长了React.Component{
render(){
const{day,finds}=this.props
让米尔斯列表;
如果(膳食[日]){
膳食清单=膳食[日]
.map((膳食、钥匙)=>
)
}
返回(
{day}
{膳食和膳食[日]&&mealsList}
)
}
}
膳食成分
class Days extends React.Component{
render() {
const { day, meals } = this.props
let mealsList;
if (meals[day]) {
mealsList = meals[day]
.map((meal, key) =>
<Meals
key={key}
day={day}
meal={meal}
/>
)
}
return(
<div className="Days">
<h3>{day}</h3>
{meals && meals[day] && mealsList}
</div>
)
}
}
class Meals extends React.Component {
static contextType = StashContext;
state = {
recipeTitle: 'No Title',
recipeImageUrl: '',
showModal: false
}
findRecipe = (recipeId, recipes) => {
const recipe = recipes.find( recipe => recipe.id == recipeId)
if (recipe) {
this.setState({
recipeTitle: recipe.title,
recipeImageUrl: recipe.image_url
})
}
}
componentDidMount() {
const { recipes } = this.context
const { meal } = this.props
this.findRecipe(meal.recipe_id, recipes)
}
handleClickDelete = (event) => {
const { day, meal } = this.props
const { id } = meal
event.preventDefault()
this.context.deleteMeal(day, id)
}
toggleModal = () => {
this.setState({
showModal: !this.state.showModal
})
}
render(){
const { recipeTitle, recipeImageUrl, showModal } = this.state;
const { meal } = this.props;
const customStyles = {
overlay: {
background: '#4c645682'
},
content: {
background: 'rgb(240 240 240)'
}
}
const permissions = {
edit: false,
add: false,
delete: false
}
return (
<div className="Meals">
{showModal &&
<DisplayModal
meal={meal}
customStyles={customStyles}
showModal={showModal}
closeModal={this.toggleModal}
label="Meal Modal"
permissions={permissions}
/>
}
<div className="Meals__info">
<div className="info_box left">
<div className="Meals__img">
<img src={recipeImageUrl} alt="Placeholder" />
</div>
</div>
<div className="info_box middle">
<div className="Meals__recipe-title">
{recipeTitle}
</div>
</div>
<div className="info_box right">
<div className="Meals__options">
<FontAwesomeIcon
icon={faEye}
onClick={e => {this.setState({showModal: true})}} />
<FontAwesomeIcon
icon={faBackspace}
onClick={this.handleClickDelete} />
</div>
</div>
</div>
</div>
)
}
}
export default Meals
class.Component{
静态上下文类型=静态上下文;
状态={
回信:“没有头衔”,
recipeImageUrl:“”,
showModal:错误
}
findRecipe=(recipeId,菜谱)=>{
const recipe=recipes.find(recipe=>recipe.id==recipeId)
如果(配方){
这是我的国家({
回复:recipe.title,
recipeImageUrl:recipe.image\u url
})
}
}
componentDidMount(){
const{recipes}=this.context
const{mean}=this.props
this.findRecipe(meal.recipe\u id,recipes)
}
handleClickDelete=(事件)=>{
const{day,meat}=this.props
常量{id}=1
event.preventDefault()
this.context.deleteMedine(天,id)
}
toggleModal=()=>{
这是我的国家({
showmodel:!this.state.showmodel
})
}
render(){
const{RecipeTile,recipeImageUrl,showModal}=this.state;
const{mean}=this.props;
常量自定义样式={
覆盖:{
背景:“#4c645682”
},
内容:{
背景:“rgb(240)”
}
}
常量权限={
编辑:false,
加:错,,
删除:false
}
返回(
{showmodel&&
}
{recipeTitle}
{this.setState({showmodel:true}}}/>
)
}
}
导出默认膳食
食谱id似乎是无关的,我认为不需要它,您应该能够按天和id删除一顿饭
其思想是在您打算更新的每个级别上粗略地复制state对象
deleteMeal = (day, mealId) => {
this.setState(prevState => ({
// copy existing state
...prevState,
// update meals key
meals: {
// copy existing meals state
...prevState.meals,
// update day key & filter meals array by id
[day]: prevState.meals[day].filter(({ id }) => id !== mealId),
},
}));
}
问题-反应不良键
您正在使用数组索引作为Days
组件中的react键
meals[day].map((meal, key) => (
<Meals
key={key} // <-- array index!!
day={day}
meal={meal}
/>
))
为什么您需要膳食和食谱ID?一天中的两个元素是否可以具有相同的用餐id?我想我已经回答了(2),但对于(1),我认为我们需要更多的上下文来了解您的商店与UI(即组件)的关系,可能与删除功能有关,虽然现在还不清楚为什么你可能有两个真相来源。嗯,我必须更深入地了解prevState,因为我以前从未使用过它。为了回答你关于recipeId的其他评论,我把recipe对象放在了商店外面,因为我认为它可能与删除这顿饭无关?它只是一个id,用于使用您的解决方案引用该餐的食谱(用于显示),我可以删除该餐对象…但它仍然没有删除正确的餐对象。我刚刚发现,无论我单击要删除哪顿饭,它都会在第一天删除最后一顿饭。所以对于周一的餐食,如果我点击餐食id 1,它将删除id 3,然后是2,然后是1@staysee可能处理程序没有被传递正确的值。你能更新你的问题以包括你的组件代码,以及你是如何映射你的UI和作为处理程序附加deletemine
的吗?嗨,Drew,我刚刚用我的组件更新了我的问题@staysee我读对了吗,fines
组件只渲染一个fine对象deletemine
(this.context.deletemine
)在handleClickDelete
中通过this.props.day
和this.props.dine.id
调用?您是否在处理程序中记录了用餐id以确保它是您想要的?然后再次登录到deletemine
?你能分享上下文代码吗?你删除那里的方式可能有点愚蠢。