Reactjs 同级组件的React Ref

Reactjs 同级组件的React Ref,reactjs,Reactjs,我有一个名为Home的组件,其中包含LeftNav、BookSearch和HomeCart组件BookSearch组件有一个输入字段,HomeCart组件有一个按钮单击HomeCart组件中的按钮时,我需要聚焦BookSearch组件中的输入字段。 我做了一些研究,只能聚焦同一个组件中的一个元素。如何使用React Ref实现所需的行为 Home.jsx class Home extends React.Component { render() { return ( &l

我有一个名为
Home
的组件,其中包含
LeftNav
BookSearch
HomeCart
组件
BookSearch组件有一个输入字段,HomeCart组件有一个按钮单击
HomeCart
组件中的按钮时,我需要聚焦
BookSearch
组件中的输入字段。

我做了一些研究,只能聚焦同一个组件中的一个元素。如何使用React Ref实现所需的行为

Home.jsx

class Home extends React.Component {
  render() {
    return (
      <React.Fragment>
        <div className="row no-gutters app">
          <div className="col-sm-12 col-md-12 col-lg-2">
            <LeftNav />
          </div>
          <div className="col-sm-12 col-md-12 col-lg-7 books-panel">
            <BookSearch test={this.test}/>
          </div>
          <div className="col-sm-12 col-md-12 col-lg-3 cart-panel">
            <HomeCart onClick={thi} />
          </div>
        </div>
      </React.Fragment>
    );
  }
}
class BookSearch extends React.Component {

  render() {

    return (
      <React.Fragment>
        <button onClick={this.test}>Focus</button>
        <div className="row text-center">
          <div className="col-12">
            <form onSubmit={this.handleSubmit}>
              <h2 className="mt-5">Start searching your favorite books</h2>
              <label htmlFor="search-query" className="sr-only">
                Search by book name
              </label>
              <input
                name="search-query"
                onChange={this.handleChange}
                type="search"
                className="book-search"
                value={this.state.query}
                placeholder="Start searching...."
              />
              <button type="submit" className="btn btn-primary btn-lg">
                Search
              </button>
            </form>
          </div>
        </div>
      </React.Fragment>
    );
  }
}
class HomeCart extends React.Component {

  focusSearchBookInput(){
    this.props.focusSearchBookInput()
  }

  render() {
    const { cart_items } = this.props;
    const cartTable = ();
    const noCartItems = (
      <React.Fragment>
        <p>No items currently available in your cart. </p>
        <button onClick={this.focusSearchBookInput} className="btn btn-success mt-5">
          <ion-icon name="search" /> Start Searching
        </button>
      </React.Fragment>
    );
    return (
      <React.Fragment>
        <div className="row text-center">
          <div className="col-12">
            <h2 className="mt-5 mb-5">Books in your cart</h2>
            {cart_items.length > 0 ? cartTable : noCartItems}
          </div>
        </div>
      </React.Fragment>
    );
  }
}
class Home extends React.Component {
  inputRef = React.createRef();

  focusHandler = () => {
    this.inputRef.current.focus();
  }

  render() {
    return (
      <React.Fragment>
        <div className="row no-gutters app">
          <div className="col-sm-12 col-md-12 col-lg-2">
            <LeftNav />
          </div>
          <div className="col-sm-12 col-md-12 col-lg-7 books-panel">
            <BookSearch inputRef={this.inputRef} />
          </div>
          <div className="col-sm-12 col-md-12 col-lg-3 cart-panel">
            <HomeCart focusHandler={this.focusHandler} />
          </div>
        </div>
      </React.Fragment>
    );
  }
}
class Home扩展了React.Component{
render(){
返回(
);
}
}
BookSearch.jsx

class Home extends React.Component {
  render() {
    return (
      <React.Fragment>
        <div className="row no-gutters app">
          <div className="col-sm-12 col-md-12 col-lg-2">
            <LeftNav />
          </div>
          <div className="col-sm-12 col-md-12 col-lg-7 books-panel">
            <BookSearch test={this.test}/>
          </div>
          <div className="col-sm-12 col-md-12 col-lg-3 cart-panel">
            <HomeCart onClick={thi} />
          </div>
        </div>
      </React.Fragment>
    );
  }
}
class BookSearch extends React.Component {

  render() {

    return (
      <React.Fragment>
        <button onClick={this.test}>Focus</button>
        <div className="row text-center">
          <div className="col-12">
            <form onSubmit={this.handleSubmit}>
              <h2 className="mt-5">Start searching your favorite books</h2>
              <label htmlFor="search-query" className="sr-only">
                Search by book name
              </label>
              <input
                name="search-query"
                onChange={this.handleChange}
                type="search"
                className="book-search"
                value={this.state.query}
                placeholder="Start searching...."
              />
              <button type="submit" className="btn btn-primary btn-lg">
                Search
              </button>
            </form>
          </div>
        </div>
      </React.Fragment>
    );
  }
}
class HomeCart extends React.Component {

  focusSearchBookInput(){
    this.props.focusSearchBookInput()
  }

  render() {
    const { cart_items } = this.props;
    const cartTable = ();
    const noCartItems = (
      <React.Fragment>
        <p>No items currently available in your cart. </p>
        <button onClick={this.focusSearchBookInput} className="btn btn-success mt-5">
          <ion-icon name="search" /> Start Searching
        </button>
      </React.Fragment>
    );
    return (
      <React.Fragment>
        <div className="row text-center">
          <div className="col-12">
            <h2 className="mt-5 mb-5">Books in your cart</h2>
            {cart_items.length > 0 ? cartTable : noCartItems}
          </div>
        </div>
      </React.Fragment>
    );
  }
}
class Home extends React.Component {
  inputRef = React.createRef();

  focusHandler = () => {
    this.inputRef.current.focus();
  }

  render() {
    return (
      <React.Fragment>
        <div className="row no-gutters app">
          <div className="col-sm-12 col-md-12 col-lg-2">
            <LeftNav />
          </div>
          <div className="col-sm-12 col-md-12 col-lg-7 books-panel">
            <BookSearch inputRef={this.inputRef} />
          </div>
          <div className="col-sm-12 col-md-12 col-lg-3 cart-panel">
            <HomeCart focusHandler={this.focusHandler} />
          </div>
        </div>
      </React.Fragment>
    );
  }
}
classbooksearch扩展了React.Component{
render(){
返回(
集中
开始搜索你最喜欢的书
按书名搜索
搜寻
);
}
}
HomeCart.jsx

class Home extends React.Component {
  render() {
    return (
      <React.Fragment>
        <div className="row no-gutters app">
          <div className="col-sm-12 col-md-12 col-lg-2">
            <LeftNav />
          </div>
          <div className="col-sm-12 col-md-12 col-lg-7 books-panel">
            <BookSearch test={this.test}/>
          </div>
          <div className="col-sm-12 col-md-12 col-lg-3 cart-panel">
            <HomeCart onClick={thi} />
          </div>
        </div>
      </React.Fragment>
    );
  }
}
class BookSearch extends React.Component {

  render() {

    return (
      <React.Fragment>
        <button onClick={this.test}>Focus</button>
        <div className="row text-center">
          <div className="col-12">
            <form onSubmit={this.handleSubmit}>
              <h2 className="mt-5">Start searching your favorite books</h2>
              <label htmlFor="search-query" className="sr-only">
                Search by book name
              </label>
              <input
                name="search-query"
                onChange={this.handleChange}
                type="search"
                className="book-search"
                value={this.state.query}
                placeholder="Start searching...."
              />
              <button type="submit" className="btn btn-primary btn-lg">
                Search
              </button>
            </form>
          </div>
        </div>
      </React.Fragment>
    );
  }
}
class HomeCart extends React.Component {

  focusSearchBookInput(){
    this.props.focusSearchBookInput()
  }

  render() {
    const { cart_items } = this.props;
    const cartTable = ();
    const noCartItems = (
      <React.Fragment>
        <p>No items currently available in your cart. </p>
        <button onClick={this.focusSearchBookInput} className="btn btn-success mt-5">
          <ion-icon name="search" /> Start Searching
        </button>
      </React.Fragment>
    );
    return (
      <React.Fragment>
        <div className="row text-center">
          <div className="col-12">
            <h2 className="mt-5 mb-5">Books in your cart</h2>
            {cart_items.length > 0 ? cartTable : noCartItems}
          </div>
        </div>
      </React.Fragment>
    );
  }
}
class Home extends React.Component {
  inputRef = React.createRef();

  focusHandler = () => {
    this.inputRef.current.focus();
  }

  render() {
    return (
      <React.Fragment>
        <div className="row no-gutters app">
          <div className="col-sm-12 col-md-12 col-lg-2">
            <LeftNav />
          </div>
          <div className="col-sm-12 col-md-12 col-lg-7 books-panel">
            <BookSearch inputRef={this.inputRef} />
          </div>
          <div className="col-sm-12 col-md-12 col-lg-3 cart-panel">
            <HomeCart focusHandler={this.focusHandler} />
          </div>
        </div>
      </React.Fragment>
    );
  }
}
类HomeCart扩展了React.Component{
focusSearchBookInput(){
this.props.focusSearchBookInput()
}
render(){
const{cart_items}=this.props;
常数表=();
常数noCartItems=(
您的购物车中当前没有可用的项目

开始搜索 ); 返回( 车里的书 {cart_items.length>0?cartTable:noCartItems} ); } }
一种解决方案可能是

Home.jsx

class Home extends React.Component {
  render() {
    return (
      <React.Fragment>
        <div className="row no-gutters app">
          <div className="col-sm-12 col-md-12 col-lg-2">
            <LeftNav />
          </div>
          <div className="col-sm-12 col-md-12 col-lg-7 books-panel">
            <BookSearch test={this.test}/>
          </div>
          <div className="col-sm-12 col-md-12 col-lg-3 cart-panel">
            <HomeCart onClick={thi} />
          </div>
        </div>
      </React.Fragment>
    );
  }
}
class BookSearch extends React.Component {

  render() {

    return (
      <React.Fragment>
        <button onClick={this.test}>Focus</button>
        <div className="row text-center">
          <div className="col-12">
            <form onSubmit={this.handleSubmit}>
              <h2 className="mt-5">Start searching your favorite books</h2>
              <label htmlFor="search-query" className="sr-only">
                Search by book name
              </label>
              <input
                name="search-query"
                onChange={this.handleChange}
                type="search"
                className="book-search"
                value={this.state.query}
                placeholder="Start searching...."
              />
              <button type="submit" className="btn btn-primary btn-lg">
                Search
              </button>
            </form>
          </div>
        </div>
      </React.Fragment>
    );
  }
}
class HomeCart extends React.Component {

  focusSearchBookInput(){
    this.props.focusSearchBookInput()
  }

  render() {
    const { cart_items } = this.props;
    const cartTable = ();
    const noCartItems = (
      <React.Fragment>
        <p>No items currently available in your cart. </p>
        <button onClick={this.focusSearchBookInput} className="btn btn-success mt-5">
          <ion-icon name="search" /> Start Searching
        </button>
      </React.Fragment>
    );
    return (
      <React.Fragment>
        <div className="row text-center">
          <div className="col-12">
            <h2 className="mt-5 mb-5">Books in your cart</h2>
            {cart_items.length > 0 ? cartTable : noCartItems}
          </div>
        </div>
      </React.Fragment>
    );
  }
}
class Home extends React.Component {
  inputRef = React.createRef();

  focusHandler = () => {
    this.inputRef.current.focus();
  }

  render() {
    return (
      <React.Fragment>
        <div className="row no-gutters app">
          <div className="col-sm-12 col-md-12 col-lg-2">
            <LeftNav />
          </div>
          <div className="col-sm-12 col-md-12 col-lg-7 books-panel">
            <BookSearch inputRef={this.inputRef} />
          </div>
          <div className="col-sm-12 col-md-12 col-lg-3 cart-panel">
            <HomeCart focusHandler={this.focusHandler} />
          </div>
        </div>
      </React.Fragment>
    );
  }
}
class Home扩展了React.Component{
inputRef=React.createRef();
focusHandler=()=>{
this.inputRef.current.focus();
}
render(){
返回(
);
}
}
ref={this.props.inputRef}
添加到BookSearch.jsx中的输入

class Home extends React.Component {
  render() {
    return (
      <React.Fragment>
        <div className="row no-gutters app">
          <div className="col-sm-12 col-md-12 col-lg-2">
            <LeftNav />
          </div>
          <div className="col-sm-12 col-md-12 col-lg-7 books-panel">
            <BookSearch test={this.test}/>
          </div>
          <div className="col-sm-12 col-md-12 col-lg-3 cart-panel">
            <HomeCart onClick={thi} />
          </div>
        </div>
      </React.Fragment>
    );
  }
}
class BookSearch extends React.Component {

  render() {

    return (
      <React.Fragment>
        <button onClick={this.test}>Focus</button>
        <div className="row text-center">
          <div className="col-12">
            <form onSubmit={this.handleSubmit}>
              <h2 className="mt-5">Start searching your favorite books</h2>
              <label htmlFor="search-query" className="sr-only">
                Search by book name
              </label>
              <input
                name="search-query"
                onChange={this.handleChange}
                type="search"
                className="book-search"
                value={this.state.query}
                placeholder="Start searching...."
              />
              <button type="submit" className="btn btn-primary btn-lg">
                Search
              </button>
            </form>
          </div>
        </div>
      </React.Fragment>
    );
  }
}
class HomeCart extends React.Component {

  focusSearchBookInput(){
    this.props.focusSearchBookInput()
  }

  render() {
    const { cart_items } = this.props;
    const cartTable = ();
    const noCartItems = (
      <React.Fragment>
        <p>No items currently available in your cart. </p>
        <button onClick={this.focusSearchBookInput} className="btn btn-success mt-5">
          <ion-icon name="search" /> Start Searching
        </button>
      </React.Fragment>
    );
    return (
      <React.Fragment>
        <div className="row text-center">
          <div className="col-12">
            <h2 className="mt-5 mb-5">Books in your cart</h2>
            {cart_items.length > 0 ? cartTable : noCartItems}
          </div>
        </div>
      </React.Fragment>
    );
  }
}
class Home extends React.Component {
  inputRef = React.createRef();

  focusHandler = () => {
    this.inputRef.current.focus();
  }

  render() {
    return (
      <React.Fragment>
        <div className="row no-gutters app">
          <div className="col-sm-12 col-md-12 col-lg-2">
            <LeftNav />
          </div>
          <div className="col-sm-12 col-md-12 col-lg-7 books-panel">
            <BookSearch inputRef={this.inputRef} />
          </div>
          <div className="col-sm-12 col-md-12 col-lg-3 cart-panel">
            <HomeCart focusHandler={this.focusHandler} />
          </div>
        </div>
      </React.Fragment>
    );
  }
}

onClick={this.props.focusHandler}
添加到HomeCart.jsx

中的按钮中,您必须传递一个道具才能在不同的组件中处理此问题,并在该道具为真时聚焦输入。例如,这通常不建议如中所述。因此(不推荐)react方法是通过
Home
组件(两者都是父组件)同步焦点,或者hacky方法是将按钮转换为具有相同
html for
属性的标签,该属性以输入元素为目标,并让浏览器像普通的标签/输入组合一样处理它。
class Home extends React.Component {
  render() {
    return (
      <React.Fragment>
        <div className="row no-gutters app">
          <div className="col-sm-12 col-md-12 col-lg-2">
            <LeftNav />
          </div>
          <div className="col-sm-12 col-md-12 col-lg-7 books-panel">
            <BookSearch test={this.test}/>
          </div>
          <div className="col-sm-12 col-md-12 col-lg-3 cart-panel">
            <HomeCart onClick={thi} />
          </div>
        </div>
      </React.Fragment>
    );
  }
}
class BookSearch extends React.Component {

  render() {

    return (
      <React.Fragment>
        <button onClick={this.test}>Focus</button>
        <div className="row text-center">
          <div className="col-12">
            <form onSubmit={this.handleSubmit}>
              <h2 className="mt-5">Start searching your favorite books</h2>
              <label htmlFor="search-query" className="sr-only">
                Search by book name
              </label>
              <input
                name="search-query"
                onChange={this.handleChange}
                type="search"
                className="book-search"
                value={this.state.query}
                placeholder="Start searching...."
              />
              <button type="submit" className="btn btn-primary btn-lg">
                Search
              </button>
            </form>
          </div>
        </div>
      </React.Fragment>
    );
  }
}
class HomeCart extends React.Component {

  focusSearchBookInput(){
    this.props.focusSearchBookInput()
  }

  render() {
    const { cart_items } = this.props;
    const cartTable = ();
    const noCartItems = (
      <React.Fragment>
        <p>No items currently available in your cart. </p>
        <button onClick={this.focusSearchBookInput} className="btn btn-success mt-5">
          <ion-icon name="search" /> Start Searching
        </button>
      </React.Fragment>
    );
    return (
      <React.Fragment>
        <div className="row text-center">
          <div className="col-12">
            <h2 className="mt-5 mb-5">Books in your cart</h2>
            {cart_items.length > 0 ? cartTable : noCartItems}
          </div>
        </div>
      </React.Fragment>
    );
  }
}
class Home extends React.Component {
  inputRef = React.createRef();

  focusHandler = () => {
    this.inputRef.current.focus();
  }

  render() {
    return (
      <React.Fragment>
        <div className="row no-gutters app">
          <div className="col-sm-12 col-md-12 col-lg-2">
            <LeftNav />
          </div>
          <div className="col-sm-12 col-md-12 col-lg-7 books-panel">
            <BookSearch inputRef={this.inputRef} />
          </div>
          <div className="col-sm-12 col-md-12 col-lg-3 cart-panel">
            <HomeCart focusHandler={this.focusHandler} />
          </div>
        </div>
      </React.Fragment>
    );
  }
}