首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理onClick在react.js下拉菜单上的更改

如何处理onClick在react.js下拉菜单上的更改
EN

Stack Overflow用户
提问于 2021-09-02 06:45:17
回答 2查看 3.2K关注 0票数 0

我需要你的建议和建议,我这里有一个反应应用程序,有三个主要组成部分:搜索栏,卡片,和过滤器。在过滤器中,我有一个下拉菜单,其中至少包含11个vlaue。所以,我想要的是,当我单击其中一个值并搜索它时,我创建了处理更改的函数。

我面临两个问题:

如何为11个元素创建

  1. 函数--
  2. --如何在单击一次之后搜索该函数,因为我尝试用一个元素进行测试,并在单击

两次后进行更改。

守则:

代码语言:javascript
复制
//Function to create the cards with their property values
function CreateCards(doc) {
  return (
    <SimpleCard
      key={doc.id}
      theCardId={doc.id}
      cardType={doc.approvetool}
      cardNum={doc.num}
      cardName={doc.name}
      cardDate={format(new Date(doc.date), "dd/MM/yyyy")} // casting the system date to arabic date
      // cardCategory={NCARMap.cardCategory}
      // cardSource={NCARMap.cardSource}
      cardDesc={doc.summary}
      cardURL={doc.image}
    />
  );
}

//create the class
export default class OfficialDocument extends Component {
  //constructor elements
  constructor(props) {
    super(props);

    //initially no data entered
    this.state = {
      NCARMap: [], // for print cards and changeable
      NCARMapAS: [], // for print cards and unchangeable (Default value always)
      search_query: "", // store the query word
      search_query_drop: "", // to store the query word of drop down menu
      noPlaceFound: false, // condition to print message when no result up
      size_query: 0, // for set the size or number of docs to return
      highlight: "",
    };
    this.handleChange = this.handleChange.bind(this);
    this.DropDownChangeOne = this.DropDownChangeOne.bind(this);
  }

  componentDidMount() {
    //Get NCARMap data, NCARMapAS used for filtering and sorting the cards once get the page
    axios
      .get(
        "http://localhost:9200/ncar_index/ncar/_search?size=100&sort=date:desc"
      ) //size to define the total docs to get / sort: sort the data for which field you want: asc or desc (desc for reverse)
      .then((resp) => {
        console.log(resp);
        this.setState({
          NCARMap: resp.data.hits.hits,
          NCARMapAS: resp.data.hits.hits,
        });
      });
  }

  //function that handle the onChange on searchbar
  handleChange(event) {
    console.log(event.target.value);
    this.setState({
      search_query: event.target.value,
      highlight: event.target.value,
    });
    axios
      .get(
        `http://localhost:9200/ncar_index/ncar/_search?q=${this.state.search_query}&size=100&sort=date:desc&analyzer=whitespace`
      )
      .then((resp) => {
        if (event?.target?.value == "") {
          // if the searchbar empty set default cards
          this.setState({
            NCARMap: this.state.NCARMapAS,
            noPlaceFound: false,
          });
        } else {
          if (resp.data.hits.hits.length > 0 && this.state.search_query != "") {
            // go for new search when there is a result and searchbar not empty
            this.setState({
              NCARMap: resp.data.hits.hits,
              noPlaceFound: false,
            });
            console.log("Successful");
          } else {
            // if there is no result make noplacefount true to print a message and show no card
            if (resp.data.hits.hits.length == 0) {
              this.setState({ noPlaceFound: true });
              console.log("Length is equal 0");
            }
          }
        }
      });
  }

  DropDownChangeOne(event) {
    console.log("lol");
    this.setState({
      search_query_drop: "approvetool:أمر",
    });
    console.log(this.state.search_query_drop);
    axios
      .get(
        `http://localhost:9200/ncar_index/ncar/_search?q=${this.state.search_query_drop}&size=100&sort=date:desc`
      )
      .then((resp) => {
        if (this.state.search_query_drop == "") {
          // if the searchbar empty set default cards
          this.setState({
            NCARMap: this.state.NCARMapAS,
            noPlaceFound: false,
          });
        } else {
          if (
            resp.data.hits.hits.length > 0 &&
            this.state.search_query_drop != ""
          ) {
            // go for new search when there is a result and searchbar not empty
            this.setState({
              NCARMap: resp.data.hits.hits,
              noPlaceFound: false,
            });
            console.log("Successful");
          } else {
            // if there is no result make noplacefount true to print a message and show no card
            if (resp.data.hits.hits.length == 0) {
              this.setState({ noPlaceFound: true });
              console.log("Length is equal 0");
            }
          }
        }
      });
  }

  render() {
    return (
      //HTML FILE Converted to React
      <div>
        <meta charSet="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <meta httpEquiv="X-UA-Compatible" content="ie=edge" />
        <title>منشآت</title>
        <link
          rel="shortcut icon"
          href="/images/favicon.png"
          type="image/x-icon"
        />
        {/*============= ScrollToTop Section Starts Here =============*/}
        <div className="overlayer" id="overlayer">
          <div className="loader">
            <div className="loader-inner" />
          </div>
        </div>
        <a href="#0" className="scrollToTop">
          <i className="fas fa-angle-up" />
        </a>
        <div className="overlay" />
        {/*============= ScrollToTop Section Ends Here =============*/}
        {/*============= Header Section Starts Here =============*/}
        <header className="header-section">
          <div className="container">
            <div className="header-wrapper">
              <div className="logo-area">
                <div className="logo">
                  <a href="/">
                    <img src="/images/logo/logo.png" alt="logo" />
                  </a>
                </div>
                <div className="support headFont">
                  <a href="/">الصفحة الرئيسية</a>
                </div>
              </div>
              <ul className="menu headFont">
                <li>
                  {/*Here we need to change the herf link*/}
                  <a href="/OfficialDocument">الوثائق و المحفوظات</a>
                </li>
                <li>
                  <a href="/WasPage">الأخبار</a>
                </li>
                <li>
                  {/*Here we need to change the herf link*/}
                  <a href="/TweetsPage">التغريدات</a>
                </li>
                {/*Here we need to change the herf link*/}
                {/* I want to know the difference between the two below */}
                <li className="d-md-none text-center">
                  <a href="#0" className="m-0 header-button">
                    تسجيل دخول
                  </a>
                </li>
              </ul>
              <div className="header-bar d-lg-none">
                <span style={{ backgroundColor: "#00A7CF" }} />
                <span style={{ backgroundColor: "#00A7CF" }} />
                <span style={{ backgroundColor: "#00A7CF" }} />
              </div>
              {/* <div class="header-right"> */}
              {/*Here we need to change the herf link*/}
              {/* <a href="#0" class="header-button d-none d-md-inline-block">تسجيل دخول</a>
          </div> */}
            </div>
          </div>
        </header>
        {/*============= Header Section Ends Here =============*/}
        {/*============= Banner Section Starts Here =============*/}
        <section
          className="banner-2 bg_img"
          data-background="/images/banner/background3.png"
        >
          <div className="container">
            <div className="banner-content-2">
              <h1 className="title cl-white">
                مرحباً بك في قسم الوثائق والمحفوظات
              </h1>
              <p className=" cl-white">
                يحتوي هذا القسم على الوثائق والمحفوظات المعتمدة من المركز الوطني
                للوثائق والمحفوظات
              </p>
              <form className="search-form round">
                <input
                  type="text"
                  style={{ textAlign: "right", color: "black" }}
                  onChange={this.handleChange}
                  placeholder="... ابحث هنا"
                />
                <button type="submit">
                  <i className="flaticon-search" />{" "}
                  <span className="d-none d-sm-inline-block">ابحث</span>
                </button>
              </form>
            </div>
          </div>
        </section>
        {/*============= Banner Section Ends Here =============*/}
        {/*============= How Search Section Starts Here =============*/}
        <div className="how-search-section padding-bottom mt--93">
          <div className="container">
            <div className="row mb-30-none justify-content-center">
              <div className="filter-rtl">
                {/*begin::Body*/}
                <div className="card-body filters">
                  {/*begin::Form*/}
                  <form>
                    {/*begin::Categories*/}
                    <div className="form-group mb-11">
                      <label className="font-size-h3 font-weight-bolder text-dark mb-7">
                        التنصيفات
                      </label>
                      {/* start dropdown menue */}
                      <div className="dropdown">
                        <button
                          className="btn btn-secondary dropdown-toggle"
                          type="button"
                          id="dropdownMenuButton"
                          data-toggle="dropdown"
                          aria-haspopup="true"
                          aria-expanded="false"
                        >
                          أداة الاعتماد
                        </button>
                        <div
                          className="dropdown-menu"
                          aria-labelledby="dropdownMenuButton"
                        >
                          <a
                            className="dropdown-item"
                            onClick={this.DropDownChangeOne}
                          >
                            أمر ملكي
                          </a>
                          <a className="dropdown-item" href="#">
                            مرسوم ملكي
                          </a>
                          <a className="dropdown-item" href="#">
                            قرار مجلس الوزراء
                          </a>
                          <a className="dropdown-item" href="#">
                            أمر سامي
                          </a>
                          <a className="dropdown-item" href="#">
                            قرار وزاري
                          </a>
                          <a className="dropdown-item" href="#">
                            قرار مجالس وهيئات
                          </a>
                          <a className="dropdown-item" href="#">
                            قرار إداري
                          </a>
                          <a className="dropdown-item" href="#">
                            توجيه سامي
                          </a>
                        </div>
                      </div>

                      <div className="dropdown">
                        <button
                          className="btn btn-secondary dropdown-toggle"
                          type="button"
                          id="dropdownMenuButton"
                          data-toggle="dropdown"
                          aria-haspopup="true"
                          aria-expanded="false"
                        >
                          فئة الوثيقة
                        </button>
                        <div
                          className="dropdown-menu"
                          aria-labelledby="dropdownMenuButton"
                        >
                          <a className="dropdown-item" href="#">
                            الاتفاقيات و المعادات الدولية العامة
                          </a>
                          <a className="dropdown-item" href="#">
                            الاتفاقيات الدولية الثنائية
                          </a>
                          <a className="dropdown-item" href="#">
                            الاتفاقيات الدولية متعددة الأطراف
                          </a>
                        </div>
                      </div>
                    </div>
                    {/* end dropdown menue */}
                    {/* Start: : DateRangePickerComponent */}
                    <DateRangePickerComponent></DateRangePickerComponent>
                    {/* End: : DateRangePickerComponent */}
                    {/*end::Categories*/}
                    <button
                      type="submit"
                      className="btn btn-primary font-weight-bolder mr-2 px-8"
                    >
                      إعادة ضبط
                    </button>
                    <button
                      type="reset"
                      className="btn-submit btn btn-clear font-weight-bolder text-muted px-8"
                    >
                      بحث
                    </button>
                  </form>
                  {/*end::Form*/}
                </div>
                {/*end::Body*/}
              </div>
              <div className="general-card">
                {this.state.noPlaceFound ? (
                  <h3 className="noPlaceFound">
                    <i className="fas fa-exclamation-circle fa-sm WarnIcon"></i>
                    لا يوجد نتائج
                  </h3>
                ) : (
                  this.state.NCARMap.map((v) => CreateCards(v._source))
                )}
                {console.log(this.state.NCARMap)}
              </div>
            </div>
          </div>
        </div>
        {/*============= How Search Section Ends Here =============*/}
        {/*============= Footer Section Starts Here =============*/}
        <footer className="footer-section pt-70-145">
          <div className="dot-slider bg_img" />
          <div className="container">
            <div className="row mb--50 justify-content-between">
              <div className="col-sm-8 col-lg-4">
                <div className="footer-widget widget-about"></div>
              </div>
            </div>
          </div>
          <div className="footer-bottom cl-white">
            <p>جميع الحقوق محفوظة © 2021</p>
          </div>
        </footer>
        {/*============= Footer Section Ends Here =============*/}
      </div>
    );
  }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-02 06:53:31

首先更改onclick函数

代码语言:javascript
复制
<a className="dropdown-item" onClick={(e) => this.DropDownChangeOne(e, 'approvetool:أمر')} >

然后在职能上:

代码语言:javascript
复制
 DropDownChangeOne(event, value) {
    console.log("lol");
    this.setState({
      search_query_drop: value,
    });
    console.log(value);
    axios
      .get(
        `http://localhost:9200/ncar_index/ncar/_search?q=${value}&size=100&sort=date:desc`
      )
      .then((resp) => {
    ....
    ....
    ....
    })
}
票数 1
EN

Stack Overflow用户

发布于 2021-09-02 07:01:13

案例1:在本例中使用map

代码语言:javascript
复制
   {
    ["أمر ملكي", ...].map((text, i) => {
     return (
       <a key="i" href="" className="dropdown-item" onClick={() => this.DropDownChangeOne("approvetool:أمر")}> // Your query for each element
        {text}
       </a>
      );
     });
   }

案例2:将查询传递给DropDownChangeOne

代码语言:javascript
复制
DropDownChangeOne(query) {
  this.setState({
    search_query_drop: query,
  });
  axios
    .get(
      `http://localhost:9200/ncar_index/ncar/_search?q=${query}&size=100&sort=date:desc`
    )
    .then((resp) => {
    ...
    });
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69025357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档