【问题标题】:clear search box after onclickonclick 后清除搜索框
【发布时间】:2020-10-29 21:35:34
【问题描述】:

我的标题中有一个搜索框。我可以在搜索后清除我的状态,但输入没有被清除。

我纯粹是使用搜索框来生成一个下拉列表,其中包含指向其各自字段的链接。所以输入字段纯粹是用来模拟搜索的

我尝试使用 refs 来定位它,但当我最终达到该值时,我无法再使用搜索了。

SearchBarHeader、SearchBox 和 SearchField 都有一个 ref。但我不确定这是否是正确的方法。

  clearSearchBar = () => {
    this.searchBarHeader.current.searchBox.current.searchField.current.value = '';
  };

以及搜索框的代码。

class Search extends Component {
  state = {
    organisationNames: [],
    errorMessage: null,
  };

  searchField = React.createRef();

  async componentDidMount() {
    const organisations = await getSearch();
    this.setState({
      organisationNames: organisations,
    });
  }

  searchHandler = (e) => {
    const searchValue = e.target.value.toLowerCase();
    if (!searchValue) {
      this.props.clearSearchResult();
    } else {
      const result = this.state.organisationNames.filter((organisationName) => {
        return organisationName.toLowerCase().includes(searchValue);
      });
      this.props.setSearchResult(result, () => {
        if (this.props.searchResult.length === 0) {
          this.setState({
            errorMessage: "No Results...",
          });
        } else {
          this.setState({
            errorMessage: null,
          });
        }
      });
    }
  };

  clearSearchInput = () => {
    this.props.clearSearchResult();
  };

  render() {
    return (
      <div className="search">
        <div className="form-group">
          <input
            ref={this.searchField}
            type="search"
            placeholder="Search for company"
            onChange={this.searchHandler}
          />
        </div>
        <div className="search-result-wrapper">
          <ul className="search-results">
            {this.props.searchResult === undefined ? (
              <Skeleton />
            ) : (
              this.props.searchResult.map((res, id) => {
                return (
                  <Link
                    key={id}
                    to={"/r/" + res}
                    onClick={this.clearSearchInput}
                  >
                    <li className="search-item">{res || <Skeleton />} </li>
                  </Link>
                );
              })
            )}
            {this.state.errorMessage === null ? (
              ""
            ) : (
              <li>{this.state.errorMessage}</li>
            )}
          </ul>
        </div>
      </div>
    );
  }
}

export default Search;

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    在我看来,您的输入缺少“值”属性,这使它对您的状态变化作出反应。从 react docs 中获取一个示例,这是理想的设置:

    this.state = {value: ''};
    (...)
    handleChange(event) {
        this.setState({value: event.target.value});
    }
    (...)
    <input type="text" value={this.state.value} onChange={this.handleChange} />
    

    按照上面的方法,你将不需要使用 refs 手动清除输入值。提交表单后,您可以简单地清除您的状态...

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

    ...您的输入应该被清除。

    这是文档的链接:https://reactjs.org/docs/forms.html

    【讨论】:

    • 对不起,我想我不清楚。我纯粹是使用搜索框来生成一个下拉列表,其中包含指向其各自字段的链接。所以输入字段纯粹是用来模拟搜索的。
    • 嗯,好的。我想知道你是否不能像处理任何输入一样处理那个搜索框?这可能会让你的事情变得更容易。使用 refs 清除输入值肯定有我不喜欢的“难闻的气味”
    • 我是 React 新手,我不太了解。这就是我在寻找解决方案时发现的。整个项目都有一股难闻的味道,哈哈哈
    • 我们都去过那里我的朋友哈哈。我有一段时间没有使用 react(切换到 Vue?),但我仍然认为您应该使用 state 来操纵该搜索框的值。为什么不试一试,告诉我们进展如何?
    • 我以一种奇怪的方式创建了这个项目。 codesandbox.io/s/autumn-dust-10qnp 我仍然无法清除搜索栏。我已经为该项目设置了一个沙箱。也许我做错了什么?
    【解决方案2】:

    您正在清除 ref,而不是状态。您的输入也没有附加值,因此即使状态被清除,它也不会反映。

    您当然可以使表单数据更加动态,而无需设置和保持companyName 不变。

    这是一个简单的工作示例:https://codesandbox.io/s/flamboyant-voice-oj85u?file=/src/App.js

    export default function App() {
      const [formData, setFormData] = useState({ companyName: "" });
    
      const handleChange = (e) => {
        setFormData({ companyName: e.target.value });
      };
    
      const handleClear = () => {
        setFormData({ companyName: "" });
      };
    
      return (
        <div className="search">
          <div className="form-group">
            <input
              type="search"
              name="companyName"
              value={formData.companyName}
              placeholder="Search for company"
              onChange={handleChange}
            />
            <button onClick={handleClear}>Clear</button>
          </div>
          <pre>{JSON.stringify(formData, null, 2)}</pre>
        </div>
      );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-06
      • 2012-10-03
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      相关资源
      最近更新 更多