реагирующий ввод закрывается до того, как я смогу (щелчок мыши) выбрать опцию

#javascript #reactjs #react-select

#javascript #reactjs #реагировать-выбрать

Вопрос:

РЕДАКТИРОВАТЬ: эта проблема возникает в Firefox (Ubuntu 16), но при использовании Chrome у меня нет проблемы.

Используя React.js , и react-select, у меня следующая ситуация:

Когда я нажимаю на выбранный ввод, отображается выпадающий список с параметрами, но он закрывается почти сразу.

Желаемое поведение: держите его открытым, пока я не выберу опцию.

Кто-нибудь знает, почему это происходит?

Вот мой код (по крайней мере, его часть).

компонент, содержащий выбранный ввод:

 import React from "react";
import { sec } from "../style/Colors";
import Select from "react-select";

const TagSelectForm = ({ onTagSelectChange, options }) => {
  return (
    <div className="tagselect-main-container">
      <Select isMulti={true} onChange={onTagSelectChange} options={options} />
    </div>
  );
};

export default TagSelectForm;

  

Родительский компонент:

 import React, { Component } from "react";
import ContentRequest from "../components/ContentRequest";
import axios from "axios";
import TagSelectForm from "../components/TagSelectForm";
import styled from "styled-components";

class OverviewPage extends Component {
  state = {
    contentRequests: [],
    contentRequestTags: [],
    filterTags: []
  };

  async componentDidMount() {
    const { data: JSON_string } = await axios.get(
      "http://localhost:8000/request"
    );
    const { requests, tags } = JSON.parse(JSON_string);
    this.setState({ contentRequests: requests, contentRequestTags: tags });
  }

  filterByTags = () => {
    const { contentRequests } = this.state;
    const filteredRequests = contentRequests.filter(request =>
      this.testContainsAFilterTag(request.tags)
    );
    return filteredRequests;
  };

  handleAddFilterTag = tag => {
    const filterTags = [...this.state.filterTags, tag];
    this.setState({ filterTags });
  };

  handleTagSelectChange = selectedTagsList => {
    this.setState({ filterTags: selectedTagsList });
  };

  handleRemoveFilterTag = tagID => {
    const filterTags = this.state.filterTags.filter(tag => tag.id !== tagID);
    console.log("filterTags", filterTags);
    this.setState({ filterTags });
  };

  setOverViewpageState = (stateName, stateValue) => {
    this.setState({ [stateName]: stateValue });
  };

  testContainsAFilterTag = tags => {
    const { filterTags } = this.state;
    const filterTagIDs = filterTags.map(tag => tag.value);
    return tags.some(tag => filterTagIDs.includes(tag.id));
  };

  renderRequests = () => {
    let { contentRequests } = this.state;
    const { filterTags } = this.state;
    const { loginToken, userID } = this.props;

    if (filterTags.length > 0) {
      contentRequests = this.filterByTags();
    }

    return (
      <RequestList>
        {contentRequests.map(request => (
          <ContentRequest
            contentRequests={contentRequests}
            key={request.id}
            loginToken={loginToken}
            request={request}
            setOverViewpageState={this.setOverViewpageState}
            userID={userID}
          />
        ))}
      </RequestList>
    );
  };

  render() {
    const { contentRequestTags, filterTags } = this.state;
    return (
      <MainContainer>
        <PageTitle>Content Request Overview</PageTitle>

        <TagSelectForm
          onTagSelectChange={this.handleTagSelectChange}
          options={contentRequestTags}
        />

        {this.renderRequests()}
      </MainContainer>
    );
  }
}

export default OverviewPage;

const MainContainer = styled.div`
  box-sizing: border-box;
  display; flex;
  flex-direction: column;
  max-width: 768px;
  margin: 0 auto;
  padding: 0.5rem;
`;

const PageTitle = styled.h1`
  font-size: 1.25rem;
`;

const RequestList = styled.ul`
  list-style-type: none;
  padding: 0;
`;
  

Комментарии:

1. Не могли бы вы предоставить рабочий пример, показывающий вашу проблему с использованием такой службы, как CodeSandbox ?

2. Дело не в коде, я заметил, что он отлично работает в Chrome, но не в FireFox.

3. Но наличие примера, подобного тому, который вы использовали, помогло бы воспроизвести ошибку и найти решение.

Ответ №1:

Я решил эту проблему, заключив react-select в тег «label», поэтому мой код выглядит так:

    <label>
      <Select
       name="name"
       options={optionsArray}
       ...
      />
   </label>