IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> React——高阶函数和受控组件 -> 正文阅读

[JavaScript知识库]React——高阶函数和受控组件

一、非受控组件:现用现取

用一个案例来展开:

要实现下图这样的一个功能:输入用户名,密码,点击登录

?


弹出输入的账号和密码值:

?


代码实现:

<body>
    <div id="root"></div>
    <script src="../node_modules/react/umd/react.development.js"></script>
    <script src="../node_modules/react-dom/umd/react-dom.development.js"></script>
    <script src="../js/babel.min.js"></script>
    <script type="text/babel">
        class Login extends React.Component {
            login = (event) => {
                event.preventDefault()//阻止表单默认行为--跳转
                const { username, password } = this
                alert(`账号为${username.value}, 密码为${password.value}`)
            }
            render() {
                return (
                    <form action="http://www.baidu.com" onSubmit={this.login}>
                        {/*表单内所有输入类dom的值,(多选、单选也算)现用现取,就是非受控组件*/}
                        用户名:<input ref={c => this.username = c} type="text" name="username" />
                        {/*现用现取:点击登录才提交表单,调用onsubmit方法,获取表单数据*/}
                        密&nbsp;码:<input ref={c => this.password = c} type="password" name="password" />
                        <button>登录</button>
                    </form>
                )
            }
        }
        ReactDOM.render(<Login />, document.getElementById('root'))
</body>

</html>

二、非受控组件

同样的需求,代码实现:

 <script type="text/babel">
        class Login extends React.Component {
            // 3.初始化状态
            state = { username: '', password: '' }

            saveUsername = (event) => {
                this.setState({username:event.target.value}) //2.把它的值给状态
            }
            savePassword = () => {
                this.setState({password:event.target.value})  //2.把它的值给状态
            }
            login = (event) => {
                event.preventDefault()//阻止表单默认行为--跳转
                // 4.从state里取值
                const { username, password } = this.state
                alert(`账号为${username}, 密码为${password}`)
            }
            // 受控组件优势:能够省略掉ref
            render() {
                return (
                    <form action="" onSubmit={this.login}>
                        {/*1.onchange事件:当发生改变时就拿到它的值,类似vue里的双向绑定*/}
                        用户名:<input onChange={this.saveUsername} type="text" name="username" />
                        密&nbsp;码:<input onChange={this.savePassword} type="password" name="password" />
                        <button>登录</button>
                    </form>
                )
            }
        }
        ReactDOM.render(<Login />, document.getElementById('root'))
    </script>

三、高阶函数_柯里化

高阶函数:如果一个函数符合下面2个规范中的任何一个,那该函数就是高阶函数。

? ? ? ? ? ? ? ? 1.若A函数,接收的参数是一个函数,那么A就可以称之为高阶函数。

? ? ? ? ? ? ? ? 2.若A函数,调用的返回值依然是一个函数,那么A就可以称之为高阶函数。

? ? ? ? ? ? ? ? 常见的高阶函数有:Promise、setTimeout、arr.map()

函数的柯里化:

通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码形式。

  <script>
        function sum(a, b, c) {
            return (a + b + c)
        }
        console.log(sum(1,2,3))
        
        // 函数的柯里化
        function sum1(a){
            return (b)=>{
                return (c)=>{
                    return a+b+c
                }
            }
        }
        console.log(sum1(1)(2)(3));
    </script>

代码实现:

 <script type="text/babel">
        // #region  #endregion 让代码折叠起来的
        // #region
        /*
            高阶函数:如果一个函数符合下面2个规范中的任何一个,那该函数就是高阶函数。
                1.若A函数,接收的参数是一个函数,那么A就可以称之为高阶函数。
                2.若A函数,调用的返回值依然是一个函数,那么A就可以称之为高阶函数。
                常见的高阶函数有:Promise、setTimeout、arr.map()

            函数的柯里化:通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码形式。
        */
        // #endregion
        class Login extends React.Component {
            // 3.初始化状态
            state = { username: '', password: '' }

            // 这个位置传的参数就是表单数据类别,比如用户名,密码,id,手机号...
            // 4.自定义一个名字传进去  dateType
            saveFormDate = (dateType) => {  //saveFormDate就是高阶函数
                // 5.想办法传给一个函数作为onchange事件的回调 return一个函数
                return (event) => {
                    // {} 在对象里取值用[]
                    // 相当于 this.setState({username:event.target.value})
                    // 相当于 this.setState({password:event.target.value})
                    // ...
                    this.setState({ [dateType]: event.target.value })//6.把它的值给状态
                }
            }

            login = (event) => {
                event.preventDefault()//阻止表单默认行为--跳转
                // 

                从state里取值
                const { username, password } = this.state
                alert(`账号为${username}, 密码为${password}`)
            }
            // 受控组件优势:能够省略掉ref
            render() {
                return (
                    <form action="" onSubmit={this.login}>
                        {/*1.onChange={this.saveFormDate('username')} 自己写的以参数形式区分传的什么*/}
                        {/*2.onChange={this.saveFormDate()} 加()是错的*/}
                        {/*3.onChange={this.saveFormDate} 要传一个函数作为onchange事件的回调,react才帮你调用*/}
                        用户名:<input onChange={this.saveFormDate('username')} type="text" name="username" />
                        密&nbsp;码:<input onChange={this.saveFormDate('password')} type="password" name="password" />
                        <button>登录</button>
                    </form>
                )
            }
        }
        ReactDOM.render(<Login />, document.getElementById('root'))
    </script>

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 18:27:19  更:2022-04-22 18:30:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:30:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码