• 受控组件、非受控组件、高阶函数、函数柯里化


    -

    比如表单、input、radio、checkbox等标签,数据现用现取的标签叫非受控组件

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>非受控组件</title>
    </head>
    <body>
      <!-- 准备一个容器 -->
      <div id="test"></div>
      <!-- 引入react核心库 -->
      <script src="https://cdn.bootcdn.net/ajax/libs/react/18.2.0/umd/react.development.min.js"></script>
      <!-- 引入react-dom, 用于支持react操作dom, 需要在核心库之后引入 -->
      <script src="https://cdn.bootcdn.net/ajax/libs/react-dom/18.2.0/umd/react-dom.development.min.js"></script>
      <!-- 引入babel.js,用于将jsx转化为js -->
      <script src="https://cdn.bootcdn.net/ajax/libs/babel-standalone/7.18.7/babel.min.js"></script>
      <!-- 引入prop-types -->
      <script src="https://cdn.bootcdn.net/ajax/libs/prop-types/15.8.1/prop-types.min.js"></script>
      <script type="text/babel">
        // 创建组件
        class Login extends React.Component {
          render() {
            return (
              <form action="http://www.baidu.com" onSubmit={this.handleSubmit}>
                用户名:<input ref={ c => this.username = c } type="text" name="username" />
                密码:<input ref={ c => this.password = c } type="password" name="password" />
                <button>登录</button>
              </form>
            )
          }
          // 表单提交回调
          handleSubmit = (event) => {
            event.preventDefault(); // 阻止表单默认提交的行为
            const { username, password } = this;
            alert(username.value, password.value)
          }
        }
        // 渲染组件
        ReactDOM.render(<Login />, document.getElementById('test'))
      </script>
    </body>
    </html>

    把非受控组件的值存到状态中,取的时候从状态中取,叫受控组件

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>受控组件</title>
    </head>
    <body>
      <!-- 准备一个容器 -->
      <div id="test"></div>
      <!-- 引入react核心库 -->
      <script src="https://cdn.bootcdn.net/ajax/libs/react/18.2.0/umd/react.development.min.js"></script>
      <!-- 引入react-dom, 用于支持react操作dom, 需要在核心库之后引入 -->
      <script src="https://cdn.bootcdn.net/ajax/libs/react-dom/18.2.0/umd/react-dom.development.min.js"></script>
      <!-- 引入babel.js,用于将jsx转化为js -->
      <script src="https://cdn.bootcdn.net/ajax/libs/babel-standalone/7.18.7/babel.min.js"></script>
      <!-- 引入prop-types -->
      <script src="https://cdn.bootcdn.net/ajax/libs/prop-types/15.8.1/prop-types.min.js"></script>
      <script type="text/babel">
        // 创建组件
        class Login extends React.Component {
          render() {
            return (
              <form action="http://www.baidu.com" onSubmit={this.handleSubmit}>
                用户名:<input onChange={this.saveUsername} type="text" name="username" />
                密码:<input onChange={this.savePassword} type="password" name="password" />
                <button>登录</button>
              </form>
            )
          }
          // 保存用户名
          saveUsername = (event) => {
            this.setState({ username: event.target.value })
          }
          // 保存密码
          savePassword = (event) => {
            this.setState({ password: event.target.value })
          }
          // 表单提交回调
          handleSubmit = (event) => {
            event.preventDefault(); // 阻止表单默认提交的行为
            const { username, password } = this.state;
            console.log(username, password);
          }
        }
        // 渲染组件
        ReactDOM.render(<Login />, document.getElementById('test'))
      </script>
    </body>
    </html>

     -

    高阶函数、函数柯里化

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>高阶函数,函数柯里化</title>
    </head>
    <body>
      <!-- 准备一个容器 -->
      <div id="test"></div>
      <!-- 引入react核心库 -->
      <script src="https://cdn.bootcdn.net/ajax/libs/react/18.2.0/umd/react.development.min.js"></script>
      <!-- 引入react-dom, 用于支持react操作dom, 需要在核心库之后引入 -->
      <script src="https://cdn.bootcdn.net/ajax/libs/react-dom/18.2.0/umd/react-dom.development.min.js"></script>
      <!-- 引入babel.js,用于将jsx转化为js -->
      <script src="https://cdn.bootcdn.net/ajax/libs/babel-standalone/7.18.7/babel.min.js"></script>
      <!-- 引入prop-types -->
      <script src="https://cdn.bootcdn.net/ajax/libs/prop-types/15.8.1/prop-types.min.js"></script>
      <script type="text/babel">
        // #region
          /*
            高阶函数:如果一个函数符合下面两个中的任何一个,那该函数就是高阶函数
              1、若A函数接收的一个参数是一个函数,那么A就可以称为高阶函数
              2、若A函数调用的返回值依然是一个函数,那么A就可以称之为高阶函数
              常见的高阶函数有:Promise、setTimeout、数组身上的一些方法等
            函数柯里化:通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码形式
          */
        // #endregin
        // 创建组件
        class Login extends React.Component {
          render() {
            return (
              <form action="http://www.baidu.com" onSubmit={this.handleSubmit}>
                用户名:<input onChange={this.saveFormData('username')} type="text" name="username" />
                密码:<input onChange={this.saveFormData('password')} type="password" name="password" />
                <button>登录</button>
              </form>
            )
          }
          // 保存用户名
          saveUsername = (event) => {
            this.setState({ username: event.target.value })
          }
          // 保存密码
          savePassword = (event) => {
            this.setState({ password: event.target.value })
          }
          // 保存表单数据
          saveFormData = (dataType) => {
            return (event) => {
              this.setState({ [dataType]: event.target.value })
            }
          }
          // 表单提交回调
          handleSubmit = (event) => {
            event.preventDefault(); // 阻止表单默认提交的行为
            const { username, password } = this.state;
            console.log(username, password);
          }
        }
        // 渲染组件
        ReactDOM.render(<Login />, document.getElementById('test'))
      </script>
    </body>
    </html>

     不用柯里化实现

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>不用函数柯里化实现</title>
    </head>
    <body>
      <!-- 准备一个容器 -->
      <div id="test"></div>
      <!-- 引入react核心库 -->
      <script src="https://cdn.bootcdn.net/ajax/libs/react/18.2.0/umd/react.development.min.js"></script>
      <!-- 引入react-dom, 用于支持react操作dom, 需要在核心库之后引入 -->
      <script src="https://cdn.bootcdn.net/ajax/libs/react-dom/18.2.0/umd/react-dom.development.min.js"></script>
      <!-- 引入babel.js,用于将jsx转化为js -->
      <script src="https://cdn.bootcdn.net/ajax/libs/babel-standalone/7.18.7/babel.min.js"></script>
      <!-- 引入prop-types -->
      <script src="https://cdn.bootcdn.net/ajax/libs/prop-types/15.8.1/prop-types.min.js"></script>
      <script type="text/babel">
        // 创建组件
        class Login extends React.Component {
          render() {
            return (
              <form action="http://www.baidu.com" onSubmit={this.handleSubmit}>
                用户名:<input onChange={ e => this.saveFormData(e, 'username') } type="text" name="username" />
                密码:<input onChange={ e => this.saveFormData(e, 'password') } type="password" name="password" />
                <button onClick={this.handleSubmit}>登录</button>
              </form>
            )
          }
          // 保存表单数据
          saveFormData = (event, dataType) => {
            this.setState({ [dataType]: event.target.value })
          }
          // 表单提交回调
          handleSubmit = (event) => {
            event.preventDefault(); // 阻止表单默认提交的行为
            const { username, password } = this.state;
            console.log(username, password);
          }
        }
        // 渲染组件
        ReactDOM.render(<Login />, document.getElementById('test'))
      </script>
    </body>
    </html>

    -

  • 相关阅读:
    处理数据
    Vue--Vue常用指令及操作
    Vue--Vue实例
    ES6--解构赋值
    ES6--入门
    前端模块化开发
    Node.js--入门
    HTML5--canvas与svg的使用
    input整理
    移动端开发入门
  • 原文地址:https://www.cnblogs.com/fqh123/p/16644758.html
Copyright © 2020-2023  润新知