克服无状态组件中缺少引用的问题

时间:2016-03-10 14:05:48

标签: reactjs

我想创建一个无状态搜索组件。单击该按钮时,我需要访问搜索字段的值。以下是可接受的方式吗?这种方法有什么缺点吗?

const Search = ({onBtnClick}) => {
    const onClick = (e) => {
      const query = e.target.previousSibling.value;
      onBtnClick(query);
    };  

    return(
      <div>
        <input type="search" />
        <button onClick={onClick}>Search</button>
      </div>
    )   
  }

2 个答案:

答案 0 :(得分:8)

在无状态组件中,您可以将reffunction一起使用,就像这样

const Search = ({ onBtnClick }) => {
  let search;
  
  const setNode = (node) => {
    search = node;
  };
  
  const onClick = () => {
    onBtnClick(search.value);
  };  

  return (
    <div>
      <input type="search" ref={ setNode } />
      <button onClick={ onClick }>Search</button>
    </div>
  );  
}

function onBtnClick(value) {
  console.log(value);
}

ReactDOM.render(
  <Search onBtnClick={onBtnClick} />,
  document.getElementById('container')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="container"></div>

答案 1 :(得分:-1)

我不是反应的鉴赏家,但我认为你的方法没问题, 因为在官方反应文件中,我没有看到像{value: event.target.value}那样的事情:

enter image description here

这里我们有组件与州,并有这个:

this.setState({value: event.target.value});

但我认为在没有状态的组件中,可以使用:

let query = e.target.previousSibling.value;
onBtnClick(query);

PS:我也喜欢Alexander T.回答。)