react怎么获取子组件 - 网站

react怎么获取子组件

分类:React入门教程_React框架基础教程 · 发布时间:2020-09-22 10:24 · 阅读:1862

React16.8中父组件获取子组件数据的3中方式

一、类组件的情况下

1、定义父组件(直接使用ref)

export default class UserRef1 extends Component {
  constructor(props) {
    super(props);
    this.child = React.createRef();
  }
  focus = () => {
    console.log(this.child.current.inputRef.current.value);
    this.child.current.inputRef.current.focus();
  }
  render() {
    return (
      <div>
        <Child ref={this.child} />
        <button onClick={this.focus}>获取焦点</button>
      </div>
    )
  }
}

2、子组件中

class Child extends Component {
  constructor(props) {
    super(props);
    this.state = {
      name: '哈哈'
    }
    this.inputRef = React.createRef();
  }
  render() {
    return (
      <input type="text" value={this.state.name} onChange={(e) => this.setState(e.target.value)} ref={this.inputRef} />
    )
  }
}

二、函数组件

在函数组件中要获取子组件的数据,需要两步骤1.将ref传递到子组件中,2.需要使用forwardRef对子组件进行包装

1、父组件

export default () => {
  const parentRef = useRef();
  function focusHander() {
    console.log(parentRef);
    parentRef.current.focus();
    parentRef.current.value = '哈哈';
  }
  return (
    <>
      <ForwardChild ref={parentRef} />
      <button onClick={focusHander}>获取焦点</button>
    </>
  )
}

2、子组件中

function Child(props, parentRef) {
  console.log(props);
  return (
    <>
      <input type="text" ref={parentRef} />
    </>
  )
}
/**
 * 使用forwardRef将ref直接传递进去
 */
let ForwardChild = forwardRef(Child);

三、优化

上面的方式都会将组件中全部的数据暴露出去,有时候我们想只想暴露出一部分数据

1、子组件的代码

import React, { useState, useRef, useImperativeHandle, forwardRef } from 'react'
function Child(props, parentRef) {
  const inputRef = useRef();
  useImperativeHandle(parentRef, () => {
    // return返回的值就可以被父组件获取到
    return {
      focus() {
        inputRef.current.focus();
      }
    }
  })
  return (
    <>
      <p>{props.name}</p>
      <input type="text" ref={inputRef} />
    </>
  )
}
let ForwardChidl = forwardRef(Child);

2、父组件的代码

export default () => {
  const parentRef = useRef();
  const focusHandler = () => {
    parentRef.current.focus();
  }
  return (
    <>
      <ForwardChidl ref={parentRef} name={'你好'} />
      <button onClick={focusHandler}>获取焦点</button>
    </>
  )
}

更多相关技术文章,请访问HTML中文网

标签:
react

相关文章

react中怎么使用sass?

方法:1、使用npm工具安装sass-loader和node-sass依赖;2、配置webpack.config.js文件;3、在需要的组件中引入scss,然后添加scss代码即可。

react怎么判断checkbox是否被选中

react判断checkbox是否被选中的方法:可以通过【if ($(&quot;#checkbox-id&quot;).get(0).checked) {}】方法来进行判断。还可以通过原生js方法来进行判断,如【ele.checked】。

react子组件如何向父组件传值?

在react中,首先通过父组件给子组件传递一个函数,然后子组件通过参数传到父组件,通过props来传递函数的引用,并通过回调的方式实现;其实就是子组件调用父组件的方法,把值以形参的方式传出来。

react组件什么时候会重新渲染?

每当组件状态改变时,React就会调用render函数进行重新渲染。更改状态意味着当调用setState函数时,React触发更新;这不仅意味着将调用组件的render函数,而且还意味着重新渲染其所有后续子组件,无论其prop是否已更改。

react组件生命周期有几个阶段?

React组件生命周期有三个阶段:加载、更新和卸载。加载阶段表示一个组件实例被创建并被插入到DOM中;更新阶段表示由状态或属性的改变导致组件的重新渲染;卸载阶段表示组件从DOM中移除。

返回分类 返回首页