Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.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
Node.js 如何将只有1个嵌套状态的状态应用于MongoDB_Node.js_Reactjs_Mongodb_Mern - Fatal编程技术网

Node.js 如何将只有1个嵌套状态的状态应用于MongoDB

Node.js 如何将只有1个嵌套状态的状态应用于MongoDB,node.js,reactjs,mongodb,mern,Node.js,Reactjs,Mongodb,Mern,我试图在对密码进行哈希运算时获取mongoDB的输入值 但是我的方案中的密码在一个对象(localProvider)中。(这仅用于教育目的,这是我的老师编写的代码) 我尝试在register.js中使用onChange传递输入值 [event.target.name]:event.target.value 只有这行代码仅适用于不在对象内部的单个值。 正如您在方案中所看到的,据我所知,无法将值传递给单个状态值和嵌套状态值 那么,有没有一个解决方案来修复代码,这样我就可以在1个handleChang

我试图在对密码进行哈希运算时获取mongoDB的输入值

但是我的方案中的密码在一个对象(localProvider)中。(这仅用于教育目的,这是我的老师编写的代码)

我尝试在register.js中使用onChange传递输入值

[event.target.name]:event.target.value
只有这行代码仅适用于不在对象内部的单个值。 正如您在方案中所看到的,据我所知,无法将值传递给单个状态值和嵌套状态值

那么,有没有一个解决方案来修复代码,这样我就可以在1个handleChange中将用户名和电子邮件推送到状态,并将密码推送到localProvider

来自my register.js的代码

class Signup extends Component {
  constructor() {
        super()
        this.state = {
            username: '',
      email: '',
      redirectTo: null,
      localProvider:{
         password: ''

      }


    }

        this.handleSubmit = this.handleSubmit.bind(this)
    this.handleChange = this.handleChange.bind(this)
  }
  handleInputChange(event, value){
      this.setState({
        [event.target.name]: event.target.value
      })
  }
  handleChange(el) {
    let inputName = el.target.name;
    let inputValue = el.target.value;

    let statusCopy = Object.assign({}, this.state);
    statusCopy.localProvider[inputName].value = inputValue;

    this.setState(statusCopy);
  }
    handleSubmit(event) {
        console.log('sign-up handleSubmit, username: ')
        console.log(this.state.username)
        event.preventDefault()

        //request to server to add a new username/password
        axios.post('/api/v1/users/', {
            ...this.state
        })
            .then(response => {
                console.log(response)
                if (!response.data.errmsg) {
          console.log('successful signup')
          this.props.history.push("/");
                } else {
                    console.log('username already taken')
                }
            }).catch(error => {
                console.log('signup error: ')
                console.log(error)

            })
  }  
  render() {
    const { classes } = this.props;



    return (
      <React.Fragment>
        <CssBaseline />
        <Paper className={classes.paper}>
          <Avatar className={classes.avatar}>
            <LockOutlinedIcon />
          </Avatar>
          <Typography component="h1" variant="h5">
            Sign in
          </Typography>
          <form  className={classes.form}>
          <FormControl margin="normal" required fullWidth>
              <InputLabel htmlFor="name">Name</InputLabel>
              <Input name="username" type="text" id="username"  autoComplete="username" onChange={this.handleInputChange}  />
            </FormControl>
            <FormControl margin="normal" required fullWidth>
              <InputLabel htmlFor="email">Email Address</InputLabel>
              <Input id="email" name="email" autoComplete="email" onChange={this.handleInputChange} />
            </FormControl>
            <FormControl margin="normal" required fullWidth>
              <InputLabel htmlFor="password">Password</InputLabel>
              <Input type="password" id="password" autoComplete="current-password" onChange={this.handleChange} name="password"/>
            </FormControl>
            <FormControlLabel
              control={<Checkbox value="remember" color="primary" />}
              label="Remember me"
            />
            <Button
              type="submit"
              fullWidth
              variant="contained"
              color="primary"

            >
              Sign in
            </Button>
          </form>
        </Paper>
      </React.Fragment>
    )
  }
}

export default withStyles(styles)(Signup);```
类注册扩展组件{
构造函数(){
超级()
此.state={
用户名:“”,
电子邮件:“”,
重定向到:null,
本地提供者:{
密码:“”
}
}
this.handleSubmit=this.handleSubmit.bind(this)
this.handleChange=this.handleChange.bind(this)
}
handleInputChange(事件、值){
这是我的国家({
[event.target.name]:event.target.value
})
}
手柄更换(el){
让inputName=el.target.name;
让inputValue=el.target.value;
让statusCopy=Object.assign({},this.state);
statusCopy.localProvider[inputName].value=inputValue;
此.setState(statusCopy);
}
handleSubmit(事件){
log('注册handleSubmit,用户名:')
console.log(this.state.username)
event.preventDefault()
//请求服务器添加新用户名/密码
axios.post(“/api/v1/users/”{
…这个州
})
。然后(响应=>{
console.log(响应)
如果(!response.data.errmsg){
console.log('成功注册')
this.props.history.push(“/”);
}否则{
console.log('用户名已被使用')
}
}).catch(错误=>{
console.log('注册错误:')
console.log(错误)
})
}  
render(){
const{classes}=this.props;
返回(
登录
名称
电子邮件地址
密码
登录
)
}
}
导出默认样式(样式)(注册)```
Object.assign()只复制到一个级别的深度,您需要对两个级别进行深度复制,因此您可以使用它两次,或者在对象上使用spread操作符也可以

let nextState = {...this.state, localProvider: {...this.state.localProvider, [el.target.name]: [el.target.value] } };
this.setState(nextState);

查找有关嵌套状态更改的更多信息。

哦,这是因为您从未调用handleSubmit函数。去吧,把它传给你的朋友。哈哈,一个愚蠢的错误!我现在在handleInputChange上得到一个错误,即this.setState不是一个函数。有什么线索可以修复吗?是的,添加this.handleInputChange=this.handleInputChange.bind(this);在构造函数内部
  handleChange(el) {
    let inputName = el.target.name;
    let inputValue = el.target.value;

    let providerCopy = Object.assign({}, this.state.localProvider); // new
    let statusCopy = Object.assign({}, this.state, {localProvider: providerCopy}); //edited
    statusCopy.localProvider[inputName].value = inputValue;

    this.setState(statusCopy);
  }
let nextState = {...this.state, localProvider: {...this.state.localProvider, [el.target.name]: [el.target.value] } };
this.setState(nextState);