解析React ref 命令代替父子组件的数据传递问题

 更新时间:2022年08月19日 10:16:01   作者:Brave-AirPig  
这篇文章主要介绍了React - ref 命令为什么代替父子组件的数据传递,使用 ref 之后,我们不需要再进行频繁的父子传递了,子组件也可以有自己的私有状态并且不会影响信息的正常需求,这是为什么呢?因为我们使用了 ref 命令的话,ref是可以进行状态的传输

前言

我们在谈论受控组件的时候,会去使用父子通信的方式去进行数据传递,从而达到组件的受控,其实并非这一种方案,当我们对表单组件进行受控处理的时候,往往会使用 ref 命令去进行数据传递,使用传统的父子通信当然可以实现,只不过对于表单组件来说,ref 更加的便捷

使用父子通信解决表单域的数据传输问题

既然说是表单域组件,那么我们就写一个表单域组件出来

import React, { Component } from 'react';
import Field from './Field';

export default class App extends Component {
  render() {
    return (
      <section>
        <h1>登录页面</h1>

        <Field label="用户名" type="text"></Field>

        <Field label="密码" type="password"></Field>

        <button>Login</button>
        <button>clear</button>
      </section>
    );
  }
}
import React, { Component } from 'react';

export default class App extends Component {
  render() {
    return (
      <section style={{ backgroundColor: 'green' }}>
        <label htmlFor="">{this.props.label}</label>
        <input type={this.props.type} />
      </section>
    );
  }
}

接下来我们想点击登录,获取到用户名以及密码,点击清除会把表单中的数据清空

如果我们使用父子通信的方法来实现的话

父组件:

import React, { Component } from 'react';
import Field from './Field';

export default class App extends Component {
  constructor() {
    super();
    this.state = {
      username: '',
      password: '',
    };
  }

  render() {
    return (
      <section>
        <h1>登录页面</h1>

        <Field
          label="用户名"
          type="text"
          value={this.state.username}
          iptValue={value => {
            this.setState({
              username: value,
            });
          }}
        ></Field>

        <Field
          label="密码"
          type="password"
          value={this.state.password}
          iptValue={value => {
            this.setState({
              password: value,
            });
          }}
        ></Field>

        <button
          onClick={() => {
            console.log({
              username: this.state.username,
              password: this.state.password,
            });
          }}
        >
          Login
        </button>
        <button
          onClick={() => {
            this.setState({
              username: '',
              password: '',
            });
          }}
        >
          clear
        </button>
      </section>
    );
  }
}

子组件:

import React, { Component } from 'react';

export default class App extends Component {
  render() {
    return (
      <section style={{ backgroundColor: 'green' }}>
        <label htmlFor="">{this.props.label}</label>
        <input
          type={this.props.type}
          value={this.props.value}
          onChange={e => {
            this.props.iptValue(e.target.value);
          }}
        />
      </section>
    );
  }
}

OK,我们实现了,但是明显看来是比较繁琐的,一直在传来传去的 🤨

ref是否更方便

使用 ref 之后,我们不需要再进行频繁的父子传递了,子组件也可以有自己的私有状态并且不会影响信息的正常需求,这是为什么呢?因为我们使用了 ref 命令的话,ref是可以进行状态的传输的 😀

获取用户信息

子组件有自己的状态,自己修改自己

子组件:

import React, { Component } from 'react';

export default class App extends Component {
  constructor() {
    super();
    this.state = {
      value: '',
    };
  }

  render() {
    return (
      <section style={{ backgroundColor: 'green' }}>
        <label htmlFor="">{this.props.label}</label>
        <input
          type={this.props.type}
          onChange={e => {
            this.setState({
              value: e.target.value,
            });
          }}
        />
      </section>
    );
  }
}

父组件通过 ref 可以直接拿到当前表单的虚拟DOM对象,里面的 state 属性中就有我们所需要的 value 值,非常的方便 😆

父组件:

import React, { Component } from 'react';
import Field from './Field';

export default class App extends Component {
  username = React.createRef();
  password = React.createRef();

  render() {
    return (
      <section>
        <h1>登录页面</h1>

        <Field label="用户名" type="text" ref={this.username}></Field>

        <Field label="密码" type="password" ref={this.password}></Field>

        <button
          onClick={() => {
            console.log({
              username: this.username.current.state.value,
              password: this.password.current.state.value,
            });
          }}
        >
          Login
        </button>
        <button>clear</button>
      </section>
    );
  }
}

然后就是我们的清除需求了,该怎么实现?我们不能直接修改对象中的 value 值,那么还是需要使用受控理念来解决这个问题:

清除表单数据

子组件:

import React, { Component } from 'react';

export default class App extends Component {
  constructor() {
    super();
    this.state = {
      value: '',
    };
  }

  render() {
    return (
      <section style={{ backgroundColor: 'green' }}>
        <label htmlFor="">{this.props.label}</label>
        <input
          type={this.props.type}
          value={this.state.value}
          onChange={e => {
            this.setState({
              value: e.target.value,
            });
          }}
        />
      </section>
    );
  }

  clear() {
    this.setState({
      value: '',
    });
  }
}

我们给子组件中定义了一个方法,给到了一个 value 值,只要父组件触发了这个方法,那么对应的 状态以及 UI 中的 value 值都将变为 空,那么父组件怎么来触发呢?还记得我们通过 ref.current 拿到了什么吗?没错,我想说的是:通过 ref 拿到的子组件,其中的方法父组件也可以使用

父组件修改部分:

<button
  onClick={() => {
    this.username.current.clear();
    this.password.current.clear();
  }}
>

到此这篇关于React - ref 命令为什么代替父子组件的数据传递的文章就介绍到这了,更多相关React - ref 命令代替父子组件的数据传递内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • React 组件中实现事件代理

    React 组件中实现事件代理

    React的事件系统和浏览器事件系统相比,主要增加了两个特性:事件代理、和事件自动绑定,本文主要介绍了React 组件中实现事件代理,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 解析react 函数组件输入卡顿问题 usecallback react.memo

    解析react 函数组件输入卡顿问题 usecallback react.memo

    useMemo是一个react hook,我们可以使用它在组件中包装函数。可以使用它来确保该函数中的值仅在依赖项之一发生变化时才重新计算,这篇文章主要介绍了react 函数组件输入卡顿问题 usecallback react.memo,需要的朋友可以参考下
    2022-07-07
  • 通过示例讲解Remix 设计哲学理念

    通过示例讲解Remix 设计哲学理念

    这篇文章主要为大家通过示例讲解了Remix 设计哲学理念,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 取消正在运行的Promise技巧详解

    取消正在运行的Promise技巧详解

    这篇文章主要为大家介绍了取消正在运行的Promise技巧详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 基于webpack4搭建的react项目框架的方法

    基于webpack4搭建的react项目框架的方法

    本篇文章主要介绍了基于webpack4搭建的react项目框架的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • 2023年最新react面试题总结大全(附详细答案)

    2023年最新react面试题总结大全(附详细答案)

    React是一种广泛使用的JavaScript库,为构建用户界面提供了强大的工具和技术,这篇文章主要给大家介绍了关于2023年最新react面试题的相关资料,文中还附有详细答案,需要的朋友可以参考下
    2023-10-10
  • ahooks正式发布React Hooks工具库

    ahooks正式发布React Hooks工具库

    这篇文章主要为大家介绍了ahooks正式发布值得拥有的React Hooks工具库使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 在React中编写class样式的方法总结

    在React中编写class样式的方法总结

    在TypeScript (TSX) 中编写 CSS 样式类有几种方法,包括使用纯 CSS、CSS Modules、Styled Components 等,本文给大家介绍了几种常见方法的示例,通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-07-07
  • React 状态管理中的Jotai详解

    React 状态管理中的Jotai详解

    Jotai是一个简单、灵活、高效的React状态管理库,通过原子和派生状态的设计,使得状态管理变得直观和高效,它适用于小型应用、组件库和大型项目的局部状态管理,且与TypeScript兼容,Jotai的社区正在壮大,提供了丰富的资源和支持,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • Parcel 打包示例(React HelloWorld)

    Parcel 打包示例(React HelloWorld)

    本篇文章主要介绍了Parcel 打包示例(React HelloWorld),详细的介绍了Parcel打包的特点和使用示例,有兴趣的可以了解一下
    2018-01-01

最新评论