react中的受控组件与非受控组件

非受控组件:现用现取

复制代码
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8" />
    <title>react中的受控组件与非受控组件</title>
    <script src="https://unpkg.com/react@18/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/@babel/standalone@7/babel.min.js"></script>
    <script src="https://unpkg.com/prop-types@15.8.1/prop-types.js"></script>
</head>

<body>
    <div id="root"></div>

    <script type="text/babel">
        const root = ReactDOM.createRoot(document.getElementById('root'));
        class MyComponent extends React.Component {
            sevaDate = (e) => {
                const { name, password } = this;
                alert(`用户名:${name.value},密码:${password.value}`);
            }
            render() {
                return (
                    <form onSubmit={this.sevaDate}>
                        <input type="text" ref={c => this.name = c}></input>
                        <input type="password" ref={c => this.password = c}></input>
                        <button type="submit">提交</button>
                    </form>
                );
            }
        };
        root.render(<MyComponent />);

    </script>
</body>

</html>

受控组件

类似于vue中的数据双向绑定

复制代码
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8" />
    <title>react中的受控组件与非受控组件</title>
    <script src="https://unpkg.com/react@18/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/@babel/standalone@7/babel.min.js"></script>
    <script src="https://unpkg.com/prop-types@15.8.1/prop-types.js"></script>
</head>

<body>
    <div id="root"></div>

    <script type="text/babel">
        const root = ReactDOM.createRoot(document.getElementById('root'));
        class MyComponent extends React.Component {
            state = {
                name: '',
                password: ''
            }
            sevaDate = (e) => {
                e.preventDefault();// 阻止表单提交的默认行为
                alert(`用户名:${this.name},密码:${this.password}`);
            }
            sevaName = (e) => {
                this.name = e.target.value; // 将输入框的值赋值给state中的name
            }
            sevaPassword = (e) => {
                this.password = e.target.value; // 将输入框的值赋值给state中的password
            }
            render() {
                return (
                    <form onSubmit={this.sevaDate}>
                        <input type="text" onChange={this.sevaName}></input>
                        <input type="password" onChange={this.sevaPassword}></input>
                        <button type="submit">提交</button>
                    </form>
                );
            }
        };
        root.render(<MyComponent />);

    </script>
</body>

</html>

总结

尽量少写非受控组件因为受控组件里一个ref都没有(官方建议少用ref)

相关推荐
发现一只大呆瓜16 分钟前
虚拟列表:支持“向上加载”的历史消息(Vue 3 & React 双版本)
前端·javascript·面试
css趣多多33 分钟前
ctx 上下文对象控制新增 / 编辑表单显示隐藏的逻辑
前端
lbb 小魔仙39 分钟前
【HarmonyOS实战】React Native 表单实战:自定义 useReactHookForm 高性能验证
javascript·react native·react.js
_codemonster40 分钟前
Vue的三种使用方式对比
前端·javascript·vue.js
寻找奶酪的mouse41 分钟前
30岁技术人对职业和生活的思考
前端·后端·年终总结
梦想很大很大1 小时前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
We་ct1 小时前
LeetCode 56. 合并区间:区间重叠问题的核心解法与代码解析
前端·算法·leetcode·typescript
张3蜂1 小时前
深入理解 Python 的 frozenset:为什么要有“不可变集合”?
前端·python·spring
无小道1 小时前
Qt——事件简单介绍
开发语言·前端·qt
广州华水科技1 小时前
GNSS与单北斗变形监测技术的应用现状分析与未来发展方向
前端