Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用textfields名称和值访问动态数组中的正确对象?_Javascript_Reactjs_Material Ui - Fatal编程技术网

Javascript 如何使用textfields名称和值访问动态数组中的正确对象?

Javascript 如何使用textfields名称和值访问动态数组中的正确对象?,javascript,reactjs,material-ui,Javascript,Reactjs,Material Ui,我有一个动态的值数组,我希望在键入和提交文本字段时能够对其进行更改。如何通过提交textfields来正确更改数组正确对象中变量的值 我试着将练习的关键与我需要的价值观联系起来,但它不起作用 这是父函数 export default class AddWorkoutForm extends Component { state = { step: 1, name: '', duration: 0, date: '',

我有一个动态的值数组,我希望在键入和提交文本字段时能够对其进行更改。如何通过提交textfields来正确更改数组正确对象中变量的值

我试着将练习的关键与我需要的价值观联系起来,但它不起作用

这是父函数

export default class AddWorkoutForm extends Component {
    state = {
        step: 1,
        name: '',
        duration: 0,
        date: '',
        exerciselist: [
            {
                id: uuid.v4(),
                exerciseName: '',
                numberOfSets: 0,
                weight: 0,
                reps: 0
            }
        ],
    }

    // Generate Exercise objects in exerciselist
    addExercises = () => {
        this.setState({
            exerciselist: [
                ...this.state.exerciselist,
                {
                    id: uuid.v4(),
                    exerciseName: '',
                    numberOfSets: 0,
                    weight: 0,
                    reps: 0
                }
            ]
        })
    }

    // Remove exercise object in exerciselist
    removeExercises = (id) => {
        if (this.state.exerciselist.length > 1) {
            this.setState({
                exerciselist: [...this.state.exerciselist.filter(exercise => exercise.id !== id)]
            })
        }
    }

    // Proceed to next step
    nextStep = () => {
        const { step } = this.state;
        this.setState({
            step: step + 1
        });
    };

    // Go back to prev step
    prevStep = () => {
        const { step } = this.state;
        this.setState({
            step: step - 1
        });
    };

    // Handle fields change
    handleChange = (e) => {
        this.setState({ [e.target.name]: e.target.value });
    };

    render() {
        const { step } = this.state;
        const { name, duration, date, exerciselist } = this.state;
        const values = { name, duration, date, exerciselist };
        switch (step) {
            case 1:
                return (
                    <AddWorkout
                        nextStep={this.nextStep}
                        handleChange={this.handleChange}
                        values={values}
                    />
                );
            case 2:
                return (
                    <AddExercise
                        nextStep={this.nextStep}
                        prevStep={this.prevStep}
                        handleChange={this.handleChange}
                        addExercises={this.addExercises}
                        removeExercises={this.removeExercises}
                        values={values}
                    />
                );
            case 3:
                return (
                    <AddWorkoutConfirm
                        nextStep={this.nextStep}
                        prevStep={this.prevStep}
                        handleChange={this.handleChange}
                        values={values}
                    />
                );
        }
    }
}

导出默认类AddWorkoutForm扩展组件{
状态={
步骤:1,
名称:“”,
持续时间:0,
日期:'',
练习表:[
{
id:uuid.v4(),
练习名:“”,
数量集:0,
重量:0,,
销售代表:0
}
],
}
//在练习列表中生成练习对象
加法器练习=()=>{
这是我的国家({
练习表:[
…此.state.exerciselist,
{
id:uuid.v4(),
练习名:“”,
数量集:0,
重量:0,,
销售代表:0
}
]
})
}
//删除练习列表中的练习对象
removeExercises=(id)=>{
if(this.state.exerciselist.length>1){
这是我的国家({
exerciselist:[…this.state.exerciselist.filter(exercise=>exercise.id!==id)]
})
}
}
//继续下一步
下一步=()=>{
const{step}=this.state;
这是我的国家({
步骤:步骤+1
});
};
//返回上一步
prevStep=()=>{
const{step}=this.state;
这是我的国家({
步骤:步骤-1
});
};
//处理字段更改
handleChange=(e)=>{
this.setState({[e.target.name]:e.target.value});
};
render(){
const{step}=this.state;
const{name,duration,date,exerciselist}=this.state;
常量值={name,duration,date,exerciselist};
开关(步骤){
案例1:
返回(
);
案例2:
返回(
);
案例3:
返回(
);
}
}
}
这是用于映射动态数组中每个对象的字段的代码:

export default class AddExercise extends Component {

    continue = (e) => {
        e.preventDefault();
        this.props.nextStep();
    }

    back = (e) => {
        this.props.prevStep();
    };

    render() {
        const { values, handleChange, addExercises, removeExercises } = this.props;
        const { exerciselist } = values;
        return (
            <div style={{ textAlign: "center", height: "100%" }}>
                <ClientMenuBar title="Add An Exercise" />
                <h2>Enter Your Exercise Details</h2>
                <form>
                    <div style={styles.form}>
                        {exerciselist.map((exercise) => {
                            return (
                                <div style={styles.textfieldWrapper} key={exercise.id}>
                                    <TextField
                                        fullWidth
                                        label="Exercise Name"
                                        margin="dense"
                                        name="exerciseName"
                                        onChange={handleChange}
                                        defaultValue={exercise.exerciseName}
                                    />
                                    <TextField
                                        label="Starting # Of Reps"
                                        margin="dense"
                                        type="number"
                                        style={styles.textfield}
                                        name="reps"
                                        onChange={handleChange}
                                        defaultValue={exercise.reps}
                                    />
                                    <TextField
                                        label="Starting Weight"
                                        margin="dense"
                                        type="number"
                                        style={styles.textfield}
                                        name="weight"
                                        onChange={handleChange}
                                        defaultValue={exercise.weight}
                                    />
                                    <TextField
                                        label="# of Sets"
                                        margin="dense"
                                        type="number"
                                        style={styles.textfield}
                                        name="numberOfSets"
                                        onChange={handleChange}
                                        defaultValue={exercise.numberOfSets}
                                    />
                                    <Button
                                        onClick={() => removeExercises(exercise.id)}
                                        size="small"
                                        disableRipple
                                        fullWidth
                                    >
                                        REMOVE EXERCISE
                                </Button>
                                </div>
                            );
                        })}
                        <Button
                            onClick={addExercises}
                            size="small"
                            disableRipple
                            fullWidth
                        >
                            ADD EXERCISE
                    </Button>
                    </div>
                    <div style={styles.buttonWrapper}>
                        <Button
                            color="inherit"
                            variant="contained"
                            style={styles.button}
                            size="large"
                            onClick={this.back}
                        >
                            back
                        </Button>
                        <Button
                            color="primary"
                            variant="contained"
                            style={styles.button}
                            size="large"
                            onClick={this.continue}
                        >
                            Next
                        </Button>
                    </div>
                </form>
            </div>
        )
    }
}
导出默认类AddExercise扩展组件{
继续=(e)=>{
e、 预防默认值();
this.props.nextStep();
}
后退=(e)=>{
this.props.prevStep();
};
render(){
const{values,handleChange,addExercises,removeExercises}=this.props;
常量{exerciselist}=值;
返回(
输入您的练习详细信息
{exerciselist.map((练习)=>{
返回(
removeExercises(exercise.id)}
size=“小”
无效波纹
全宽
>
消除运动
);
})}
加练习
返回
下一个
)
}
}
这就是我打印我拥有的东西的地方:

export default class AddWorkoutConfirm extends Component {

    continue = e => {
        e.preventDefault();
        // PROCESS FORM //
        this.props.nextStep();
    };

    back = e => {
        e.preventDefault();
        this.props.prevStep();
    };

    render() {
        const { name, duration, date, exerciselist } = this.props.values;
        return (
            <div style={{ textAlign: "center", height: "100%" }}>
                <ClientMenuBar title="Confirm Your Details" />
                <h2>Enter Your Workout Details</h2>
                <form style={styles.form}>
                    <List>
                        <ListItem>Workout Name: {name}</ListItem>
                        <ListItem>Estimated Duration Of Workout: {duration} mins</ListItem>
                        <ListItem>Number Of Exercises: {exerciselist.length}</ListItem>
                        <ListItem>Date Of Workout: {date}</ListItem>
                    </List>
                    <div style={{borderTop:"1px solid gray"}}>
                        {
                            exerciselist.map((exercise) => {
                            return (
                                <List key={exercise.id}>
                                    <ListItem>Exercise Name: {exercise.exerciseName}</ListItem>
                                    <ListItem>Number of Sets: {exercise.numberOfSets}</ListItem>
                                    <ListItem>Starting Weight: {exercise.weight} lbs</ListItem>
                                    <ListItem>Starting Number Of Reps: {exercise.reps}</ListItem>
                                </List>
                            )
                        })}
                    </div>
                    <br />
                    <div style={styles.buttonWrapper}>
                    <Button
                        color="inherit"
                        variant="contained"
                        style={styles.button}
                        size="large"
                        onClick={this.back}
                    >
                        back
                    </Button>
                    <Button
                        color="primary"
                        variant="contained"
                        style={styles.button}
                        size="large"
                        onClick={this.continue}
                    >
                        Confirm
                    </Button>
                    </div>
                </form>
            </div>
        )
    }
}
导出默认类AddWorkoutConfirm扩展组件{
继续=e=>{
e、 预防默认值();
//过程形式//
this.props.nextStep();
};
后退=e=>{
e、 预防默认值();
this.props.prevStep();
};
render(){
const{name,duration,date,exerciselist}=this.props.values;
返回(
输入您的训练详细信息
训练名称:{Name}
预计训练持续时间:{Duration}分钟
练习数:{exerciselist.length}
训练日期:{Date}
{
exerciselist.map((练习)=>{
返回(
练习名称:{Exercise.exerciseName}
集合数:{exercise.numberOfSets}
起始体重:{exercise.Weight}磅
开始的重复次数:{exercise.Reps}
)
})}

返回 证实 ) } }

它正确地打印出不在数组中的值,但我不知道如何对数组中的值使用handleChange。它根本没有记录我为动态数组值键入的内容。

据我所知,
handleChange
被触发
addExercises = () => {
  this.setState({
                exerciselist: [
                    ...this.state.exerciselist,
                    {
                        id: uuid.v4(),
                        exerciseName: '',
                        numberOfSets: 0,
                        weight: 0,
                        reps: 0
                    }
                ]
            })
        }`