React 组件处理数据

2020-10-02  本文已影响0人  kevin5979

受控组件 (官方推荐)

export default class Label extends PureComponent {
  constructor(props) {
    super(props);
    this.state = {
      username: ""
    }
  }

  inputChange(e) {
    this.setState({
      username: e.target.value
    })
  }

  handleSubmit(e) {
    console.log(this.state.username);
    e.preventDefault()
  }

  render() {
    const {username} = this.state
    return (
      <div>
        <form onSubmit={e => this.handleSubmit(e)}>
          <label htmlFor="username">
            用户名:
          </label>
          <input
            type="text"
            id="username"
            onChange={e => this.inputChange(e)}
            value={username}
          />
          <input type="submit" value="提交"/>
        </form>
      </div>

    )
  }
}

非受控组件

export default class App extends PureComponent {
  constructor(props) {
    super(props);

    this.usernameRef = createRef();
  }

  render() {
    return (
      <div>
        <form onSubmit={e => this.handleSubmit(e)}>
          <label htmlFor="">
            用户:<input defaultValue="默认值" type="text" name="username" ref={this.usernameRef}/>
          </label>
          <input type="submit" value="提交"/>
        </form>
      </div>
    )
  }

  handleSubmit(event) {
    // 提交时获取最终值
    console.log(this.usernameRef.current.value);
    event.preventDefault();
  }
}

Portal

ReactDOM.createPortal(child, container)
child : 任何可渲染的 React 子元素,例如一个元素,字符串或 fragment;
container : 是一个 DOM 元素
// 示例
render() {
    return ReactDOM.createPortal(
      this.props.children,
      document.getElementById("modal")
    )
  }

Fragment

错误写法: <key={***}> ... </>

return (
 <Fragment>
    <header>头部</header>
    <footer>底部</footer>
 </Fragment>
)
// 简写
<>
  <header>头部</header>
  <footer>底部</footer>
</>
// 添加key
<Fragment key={item.id}>
  <div>{item.name}</div>
  <div>{item.age}</div>
</Fragment>

StrictMode

它为其后代元素触发额外的检查和警告;
严格模式检查仅在开发模式下运行;它们不会影响生产构建;
检测以下 :

  1. 不安全的生命周期 (UNSAFE_componentWillMount)
  2. 过时的ref API (ref="string")
  3. 废弃的findDOMNode方法
  4. 意外的副作用 (constructor被调用两次)
  5. 过时的context API
// 以下代码 StrictMode 对 B、C 组件进行检测, 而不对A、D 检测
return (
  <div>
    <A/>
    <React.StrictMode>
      <B/>
      <C/>
    </React.StrictMode>
    <D/>
  </div>
);

END
上一篇下一篇

猜你喜欢

热点阅读