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

-

比如表单、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>

 

 

 

 

 

-

posted @ 2022-08-31 22:26  古墩古墩  Views(29)  Comments(0Edit  收藏  举报