简体   繁体   English

在 ReactJS 中搜索过滤器

[英]search filter in ReactJS

how to use search filter: React?如何使用搜索过滤器:React?

I tried the below method to use search effect in reactjs but the result is not coming in my case.我尝试了以下方法在 reactjs 中使用search effect ,但在我的情况下没有结果。 I think I have made a silly mistake somewhere, it would be great if anybody could figure out what I'm trying to solve is.我想我在某个地方犯了一个愚蠢的错误,如果有人能弄清楚我想要解决的是什么,那就太好了。

API end-point URL: http://localhost:8000/api/v1/post_list?search=test API 端点 URL: http://localhost:8000/api/v1/post_list?search=test

function PostListSearch() {
  const [posts, setPost] = useState([]);
  const [userId, setUserId] = useState([]);
  let signal = axios.CancelToken.source();

  function handleChange(event) {
    setUserId(event.target.value);
  }

  function handleClick(event) {
    axios
      .get(`http://localhost:8000/api/v1/post_list?search=${userId}`, {
        cancelToken: signal.token
      })
      .then(res => {
        const posts = res.data;
        setPost(posts);
      })
      .catch(err => {
        console.log(err);
      });
  }

  return (
    <React.Fragment>
      <div class="theme-layout">
        <div class="topbar stick">
          <div class="top-area">
            <div class="top-search">
              <form>
                <input
                  type="text"
                  name="search"
                  onChange={handleClick}
                  placeholder="Search keyword"
                />
                <button data-ripple>
                  <i class="ti-search"></i>
                </button>
              </form>
            </div>
          </div>
        </div>
      </div>

      <div class="row">
        {posts.map(post => (
          <ul key={post.id}>
            <div class="col-lg-8 col-xl-9">
              <img src={post.image} alt="" class="img-fluid" />
              <h3>{post.title}</h3>
            </div>
          </ul>
        ))}
      </div>
    </React.Fragment>
  );
}

export default PostListSearch;
function PostListSearch() {
  const [posts, setPost] = useState([]);
  const [userId, setUserId] = useState([]);
  let signal = axios.CancelToken.source();

  function handleChange(event) {
    setUserId(event.target.value);
  }

  function handleClick(event) {
    event.preventDefault()
    axios
      .get(`http://localhost:8000/api/v1/post_list?search=${userId}`, {
        cancelToken: signal.token
      })
      .then(res => {
        const posts = res.data;
        setPost(posts);
      })
      .catch(err => {
        console.log(err);
      });
  }

  return (
    <React.Fragment>
      <div class="theme-layout">
        <div class="topbar stick">
          <div class="top-area">
            <div class="top-search">
              <form>
                <input
                  type="text"
                  name="search"
                  onChange={handleChange}
                  placeholder="Search keyword"
                />
                <button data-ripple onClick={handleClick}>
                  <i class="ti-search"></i>
                </button>
              </form>
            </div>
          </div>
        </div>
      </div>

      <div class="row">
        {posts.map(post => (
          <ul key={post.id}>
            <div class="col-lg-8 col-xl-9">
              <img src={post.image} alt="" class="img-fluid" />
              <h3>{post.title}</h3>
            </div>
          </ul>
        ))}
      </div>
    </React.Fragment>
  );
}

export default PostListSearch;

try this out bro:D试试这个兄弟:D

I believe you can update your map logic and state initialisation as follows.我相信您可以按如下方式更新您的 map 逻辑和 state 初始化。 Just copy paste the code as it is and try with both the approaches I have mentioned.只需按原样复制粘贴代码,然后尝试使用我提到的两种方法。

 function PostListSearch() {
  const [posts, setPost] = useState([]);
  const [userId, setUserId] = useState("");  // CHANGE HERE
  let signal = axios.CancelToken.source();

  function handleChange(event) {
    setUserId(event.target.value);
  }

  function handleClick(event) {
    axios
      .get(`http://localhost:8000/api/v1/post_list?search=${userId}`, {
        cancelToken: signal.token
      })
      .then(res => {
        const posts = res.data;
        setPost(posts);
      })
      .catch(err => {
        console.log(err);
      });
  }

  return (
    <React.Fragment>
      <div class="theme-layout">
        <div class="topbar stick">
          <div class="top-area">
            <div class="top-search">
              <form>
                <input
                  type="text"
                  name="search"
                  onChange={handleChange}
                  placeholder="Search keyword"
                />
                <button data-ripple onClick={handleClick}>
                  <i class="ti-search"></i>
                </button>
              </form>
            </div>
          </div>
        </div>
      </div>

      <div class="row">
        {
                    posts.map((post) => {<ul key={post.id}>
                        <div class="col-lg-8 col-xl-9">
    
                            <img src={post.image} alt="" class="img-fluid" />
                            <h3>{post.title}</h3>
    
                        </div>
                    </ul>})
                }
      </div>
    </React.Fragment>
  );
}

export default PostListSearch;

Another solution could be to keep initialistion as it is and try to push value in array.另一种解决方案可能是保持初始化并尝试将值推送到数组中。 For this I have done changes in handleChange method为此,我对 handleChange 方法进行了更改

function PostListSearch() {
      const [posts, setPost] = useState([]);
      const [userId, setUserId] = useState([]);  
      let signal = axios.CancelToken.source();
    
      function handleChange(event) {
let currUser = userId;
currUser.push(event.target.value)
        setUserId(currUser );
      }
    
      function handleClick(event) {
        axios
          .get(`http://localhost:8000/api/v1/post_list?search=${userId}`, {
            cancelToken: signal.token
          })
          .then(res => {
            const posts = res.data;
            setPost(posts);
          })
          .catch(err => {
            console.log(err);
          });
      }
    
      return (
        <React.Fragment>
          <div class="theme-layout">
            <div class="topbar stick">
              <div class="top-area">
                <div class="top-search">
                  <form>
                    <input
                      type="text"
                      name="search"
                      onChange={handleChange}
                      placeholder="Search keyword"
                    />
                    <button data-ripple onClick={handleClick}>
                      <i class="ti-search"></i>
                    </button>
                  </form>
                </div>
              </div>
            </div>
          </div>
    
          <div class="row">
            {
                        posts.map((post) => {<ul key={post.id}>
                            <div class="col-lg-8 col-xl-9">
        
                                <img src={post.image} alt="" class="img-fluid" />
                                <h3>{post.title}</h3>
        
                            </div>
                        </ul>})
                    }
          </div>
        </React.Fragment>
      );
    }
    
    export default PostListSearch;

I believe anyone of the above solution should work.我相信上述解决方案中的任何一个都应该有效。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM