【问题标题】:search filter in ReactJSReactJS 中的搜索过滤器
【发布时间】:2020-07-03 04:15:26
【问题描述】:

如何使用搜索过滤器:React?

我尝试了以下方法在 reactjs 中使用search effect,但结果并没有出现在我的情况下。我想我在某个地方犯了一个愚蠢的错误,如果有人能弄清楚我想要解决的是什么,那就太好了。

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;

【问题讨论】:

  • 您将handleClick 函数放入输入元素而不是handleChange。了解如何将表单变成受控组件here
  • @Hangindev 是的,我之前做过更改。我仍然没有得到结果。

标签: javascript json reactjs axios


【解决方案1】:
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;

试试这个兄弟:D

【讨论】:

  • 您在哪里进行了更改?
  • 我添加了 onclick on button 和 onchage on input。当您激活按钮时,搜索才会运行:D
  • 兄弟,我仍然像以前一样得到结果。
  • 我认为某个地方的值没有正确传递。
  • ` const posts = res.data; setPost(posts);`你能告诉我console.log(res.data)
【解决方案2】:

我相信您可以按如下方式更新您的地图逻辑和状态初始化。只需照原样复制粘贴代码,然后尝试我提到的两种方法。

 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;

另一种解决方案可能是保持初始化并尝试将值推送到数组中。为此,我对 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;

我相信上述解决方案中的任何一个都应该有效。

【讨论】:

  • 好的太好了!!但结果会有所不同。例如,如果我正在搜索 test-01,那么结果应该只出现在 test-01,而不是我得到数据库中的所有帖子。
  • 我已更新答案以传递您在文本框中输入的值。请立即尝试
  • opppsss!!我仍然遇到同样的问题。 :(
  • 你能不能 console.log(event) 看看你是否在 handleClick 函数中获取文本框的值
  • 它在控制台标签中显示index.js:1 Warning: Each child in a list should have a unique "key" prop.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 2020-02-08
  • 1970-01-01
  • 2020-09-03
相关资源
最近更新 更多