gpt4 book ai didi

javascript - React - .setState 部分不起作用

转载 作者:行者123 更新时间:2023-12-02 21:32:59 25 4
gpt4 key购买 nike

我需要更新 React 状态的帮助。我正在使用 React 制作加密/解密表单。此 EncryptForm 在 App.js 中呈现。我想要做的是监听 onSubmit 函数并更新 isSubmissed 状态,然后在“Convert”按钮下呈现 decipher 值。

我的问题是为什么 .setStatehandleChange 方法中有效,但在 handleSubmit 方法中不起作用。 我缺少什么?(encryptMessagedecryptMessage 方法工作正常。)

这是 EncryptForm 组件代码。

import React, { Component } from 'react'
import crypto from 'crypto'

class EncryptForm extends Component {
state = {
userInput: '',
isSubmitted: false,
decipher: ''
}

encryptMessage(input, key) {
// Initialization Vector - 16 bytes
const iv = new Buffer(crypto.randomBytes(16), 'utf8')
const cipher = crypto.createCipheriv('aes-256-gcm', key, iv)
let encoded = cipher.update(input, 'utf8', 'base64')
encoded += cipher.final('base64')
return [encoded, iv, cipher.getAuthTag()]
}

decryptMessage(key, encoded, iv, authTag) {
const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv)
decipher.setAuthTag(authTag)
let text = decipher.update(encoded, 'base64', 'utf8')
text += decipher.final('utf8')
return text
}

/*
Non-encryption methods
*/
handleSubmit = event => {
event.preventDefault()
const KEY = new Buffer(crypto.randomBytes(32), 'utf8')
const [encrypted, iv, authTag] = this.encryptMessage(this.state.userInput, KEY)
const decrypted = this.decryptMessage(KEY, encrypted, iv, authTag)
const newState = {
...this.state,
isSubmitted: true,
decipher: decrypted
}

// THIS IS NOW UPDATING THE STATE :(
this.setState({ newState })
}

handleChange = event => {
this.setState({
[event.target.name]: event.target.value,
})
}

render() {
const { userInput, isSubmitted, decipher } = this.state
const isInvalid = userInput === ''
return (
<form onSubmit={this.handleSubmit}>
<input
type='text'
name='userInput'
placeholder='Encrypt this text...'
onChange={this.handleChange}
/>
<button disabled={isInvalid} type='submit'>Convert</button>
{isSubmitted && <p>{decipher.value}</p>}
</form>
)
}
}

export default EncryptForm

谢谢!

最佳答案

您在 handleSubmit 中设置的状态不正确。 newState 是整个状态对象,因此像 this.setState({ newState }) 这样设置它并不是更新整个状态,而是创建一个名为 的新键newState 并将其设置为您期望的状态。结果是这样的:

state = {
...previous_state,
newState: {
...this.state,
isSubmitted: true,
decipher: decrypted
},
}

相反,您可以执行以下操作来正确更新:

// desctructure so it overwrites each key
this.setState({ ...newState });

// pass the non-nested object
this.setState(newState);

或者首选方法是仅更新必要的 key 。 this.setState 与给定对象和先前状态进行浅层合并。所以你不需要做 {...this.state} (事实上不鼓励这样做)。

这是最简洁、准确的方法:

this.setState({ isSubmitted: true, decipher: decrypted });

关于javascript - React - .setState 部分不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60571936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com