通过 onSubmit 在 React 中更改表单的 CSS 样式

Posted

技术标签:

【中文标题】通过 onSubmit 在 React 中更改表单的 CSS 样式【英文标题】:Changing CSS styles of Forms in React via onSubmit 【发布时间】:2020-01-25 16:43:03 【问题描述】:

我正在使用 react-bootstrap 并试图让我的 Form.Control 在提交表单时更改其 CSS 样式。当提交发生时,我可以在我的控制台中看到formStyle 在两者之间发生变化,但是当我相信它会随着状态变化时,它不会用这些新样式重新渲染。

任何解释都会非常有帮助。

    render() 
        const lockedStyle = 
            backgroundColor: "#26607d",
            color: "#ffffff",
        ;

        const unlockedStyle = 
            backgroundColor: "#ffffff",
            color: "#26607d",
        ;

        let formStyle = lockedStyle;

        const swap = event => 
            event.preventDefault();
            if (this.state.isLocked) 
                formStyle = unlockedStyle; // Change to Unlocked
                this.setState( isLocked: false );
                console.log(formStyle);
             else 
                formStyle = lockedStyle; // Change to Locked
                this.setState( isLocked: true );
                console.log(formStyle);
            
        return (
                   <Form onSubmit=swap>
                       <Form.Control 
                            type="text"
                            placeholder="First Name"
                            style=formStyle
                       >
                       <Button type="submit">Swap Styles</Button>
                   </Form>
               );
        ;

【问题讨论】:

【参考方案1】:

要导致重新渲染,状态应该会发生变化,但是每次重新渲染时,您都会在 let formStyle = lockedStyle; 中将 formstyle 设置为锁定样式

尝试将 formStyle 移动到状态变量,然后将 this.state.formStyle 应用于样式,然后您可以删除 isLocked 并仅将 formStyle 保留为状态。并在交换中的状态之间切换。

看下面的例子。

但为了最佳实践,最好让 render 方法渲染和移动所有变量到外部,因为一旦定义它们,您应该始终记住 render() 会在每次状态更改 (setState) 时发生。

const unlockedStyle = .....
const lockedStyle = ....

export class ComponenetName extends React.Component 
    constructor()
         this.state = 
              formStyle:unlockedStyle
         
         this.swap = this.swap.bind(this) //binding swap to this object for careful state changing , for future state changing from other components.... good practice
    
.....
swap = event => 
       event.preventDefault()
       this.setState((prevState) => return formStyle:(prevState.formStyle==lockedStyle? unlockedStyle : lockedStyle))```

 
 .....
 render() 
     return (
     <Form onSubmit=this.swap>
           <Form.Control 
                type="text"
                placeholder="First Name"
                style=this.state.formstyle
            >
            <Button type="submit">Swap Styles</Button>
 </Form>)
 





【讨论】:

非常感谢您。它确实有助于阐明 react 对渲染的作用。【参考方案2】:

您可以通过直接在 FormControl 中设置样式来跳过使用变量“formstyle”吗?

style=this.state.isLocked ? lockedStyle : unlockedStyle

【讨论】:

以上是关于通过 onSubmit 在 React 中更改表单的 CSS 样式的主要内容,如果未能解决你的问题,请参考以下文章

无法覆盖React组件内的表单的onSubmit处理程序

使用 react 和 EmailJs 在表单中通过 onSubmit 传递第二个参数

为啥我不能使用 onsubmit 来更改 innerHTML?

在 React 中提交表单时如何获取要显示的名称和 uuid

让 React 表单使用 Formik 发送电子邮件

如何使用 onSubmit 键入表单组件?