【发布时间】:2021-04-25 01:38:26
【问题描述】:
我在我的代码中使用路由器和钩子, 所以我有2个组件 “添加房间” “主屏幕” 在应用程序内部,我有 addroom() 箭头函数,以及名为“rooms”的钩子,它被发送到“AddRoom”组件,如下所示:
<Router>
<Switch>
<Route exact path='/' component={() => { returnn <HomeScreen rooms={rooms} /> }} />
<Route exact path='/AddRoom' component={() => { return <AddRoom add={addRoom} rooms={rooms} /> }} /
</Switch>
</Router>
“添加房间”功能:
const [rooms, setRooms] = useState([]);
const addRoom = (room, name, color) => {
//I have tried to use here map to add index for array "rooms" it is not working//
setRooms([...rooms, { room: room, name: name, color: color ,index:{index}}])}
每次我将房间添加到“房间”数组时,我都会尝试获取索引,但它不会将它添加到我的数组中,我不明白为什么,我该怎么做?
那就是“AddRoom”组件:
import React, { Component, useState } from
'react'
import context from 'react-
bootstrappp/esm/AccordionContext';
import { render } from 'react-dom';
import { useHistory } from "react-router-
dom";
export default function AddRoom(props) {
const [room, setRoom] = useState()
const [name, setName] = useState()
const [color, setColor] = useState('black')
const [showError, setShowError] = useState(false)
const [index, setIndex] = useState([]);
const history = useHistory();
const validInput = () => {//input validation
if ((name == null) || ((room == 'Choose') || (room == null))) {//no name typed and no room chosen
debugger
window.alert('Please choose a room and enter at least one character in room name');
return true;//if alert pops up
}
else {
if (name.length > 5) {
return false;//name is too long
}
}
}
const AddClick = () => {
let result = validInput();
let path = '/';
if (result == true)//no name was typed and room was not selected
{
debugger
history.push(path);
}
else {
if (name.length > 5) {//name is too long
setShowError(true)
}
else//all fields are correct, go back to home screen with ner room
{
setShowError(false)
/* {props.rooms.map((element, i) => { */
props.add(room , name , color /*(setIndex(...index, { index: i })) */);
}
)}
history.push(path);
}
}
return (
<div className='container' >
<div className='row'>
<div className='col-sm-12 text-center' style={{ textAlign: 'center', position: "relative", top: "80px", }}>
<select onChange={(element) => { setRoom(element.target.value) }} name="room" id="room">
<option value="Choose">Choose your room</option>
<option value="Livingroom">Livingroom</option>
<option value="Kitchen">Kitchen</option>
<option value="Bedroom">Bedroom</option>
<option value="Bathroom">Bathroom</option>
</select>
<br /><br />
<input onChange={(element) => { setName(element.target.value) }} id="name" type="text" placeholder="Room Name"></input>
<div style={{ color: 'red', marginTop: '5', display: showError ? "block" : "none" }}>Room Name Is More Then 5 Character</div>
<br /><br />
<input onChange={(element) => { setColor(element.target.value) }} id="color" type="color" placeholder="Room Color"></input>
<br /><br />
<button onClick={AddClick}>Create Room</button>
</div></div></div>
)
}
在调用 addRoom 函数之前:
rooms=[{}]
调用函数addRoom后:
rooms=[{room:"Kitchen",name:"Kit",color:"red",index:0},{room:"Bathroom",name:"Bat",color:"green",index:1}...]
【问题讨论】:
-
索引是什么?在这种情况下索引是什么意思?
-
看起来你总是将新元素添加到数组的末尾。索引不总是
rooms.length - 1吗? -
房间索引,我希望每次将房间对象添加到房间数组时都是这样的:[.../rooms,{room,name,color,index}] ,但要添加索引我想做一个地图循环,所以每次我在函数“addRoom”中添加房间时它都会设置索引
-
@ElanHamburger 嗯不,它每次都会添加一个新房间,所以我没有这个问题,我只有一个索引问题我希望每个对象房间都有这样的索引:[{room1} ,{room2},...]
-
对不起,我不太明白您要做什么。您是否介意用一个示例更新您的问题,例如在您致电
addRoom之前,rooms的外观以及您希望它在通话后的外观?
标签: reactjs dictionary react-hooks jsx