【问题标题】:Inserting elements in the search URL在搜索 URL 中插入元素
【发布时间】:2022-01-14 19:22:21
【问题描述】:

我有一个 API 调用 (https://www.thecocktaildb.com/api/json/v1/1/filter.php?i=${e.target.value}),我想做的是根据该 e.target.value 查找多个元素。 我有以下设置:

import React, {useState} from 'react'
import { useGlobalContext } from './helpers/context'

export default function IngredientPage() {
  var {cocktails} = useGlobalContext()
  const {ingredients} = useGlobalContext()
  const [cocktailList, setCocktailList] = useState([])
  
  const handleSubmit = (e) => {
    console.log(e.target.value)
  }

  const handleDropdownChange = async (e) => {
    // const ingredientURL = fetch(`www.thecocktaildb.com/api/json/v1/1/filter.php?i=${e.target.value}`)
    // const selectedIngredientData = ingredientURL.json()
    // console.log(selectedIngredientData)
    const response = await fetch(`https://www.thecocktaildb.com/api/json/v1/1/filter.php?i=${e.target.value}`)
    const data = await response.json()
    const {drinks} = data
    setCocktailList(drinks)
  }

  if(cocktails.length < 1) {
    return <h2 className="section-title">No cocktails available</h2>
  }
    return (
        <div>
          <div className="form-group">
          <label>Select Ingredients</label>
          <select className="form-control" onChange={handleDropdownChange}>
          {
            ingredients.map((item) => {
                return <option key={item.ingredient} value={item.ingredient}>{item.ingredient}</option>
            })
          }
          </select>
          <button onClick={handleSubmit} type="button" className="btn btn-primary">
             <i className="fas fa-search"></i>
          </button>
          </div>
          {
            cocktailList.map((cocktail) => {
              return (
                <div key={cocktail.idDrink} className="col-sm">
                  <div className="card" style={{width: "18rem",marginTop: "2rem"}}>
                  <img className="card-img-top" src={cocktail.strDrinkThumb} alt="name" />
                  <div className="card-body">
                   <h5 className="card-title">{cocktail.strDrink}</h5>
                  </div>
                  </div>
              </div>
              )
            })
          }
        </div>
    )
}

我想找到一种方法,以便我可以选择多个元素,或者当我按下按钮时,它会将元素添加到列表中并实现另一个搜索按钮。到目前为止,我只能基于一项进行搜索。有什么想法我该怎么做?

【问题讨论】:

    标签: javascript reactjs react-hooks


    【解决方案1】:

    看起来API 采用逗号分隔的成分列表。

    • 按成分搜索

      www.thecocktaildb.com/api/json/v1/1/filter.php?i=Gin
      www.thecocktaildb.com/api/json/v1/1/filter.php?i=Vodka
      
    • 按多种成分过滤(仅适用于 $2+ Patreon 支持者)

      www.thecocktaildb.com/api/json/v1/1/filter.php?i=Dry_Vermouth,Gin,Anis
      

    假设您具有正确的访问权限,您可以指定select 元素以使用multiple 属性选择多个选项。这将需要更新onChange 处理程序逻辑以迭代选定的选项。创建一个选定选项的数组,并将它们与 "," 连接起来作为 queryString 值。

    const handleDropdownChange = async (e) => {
      const { options } = e.target;
      const selected = [];
      for (const option of options) {
        if (option.selected) selected.push(option.value);
      }
    
      try {
        const response = await fetch(`https://www.thecocktaildb.com/api/json/v1/1/filter.php?i=${selected.join(",")}`);
        const { drinks } = await response.json();
        setCocktailList(drinks);
      } catch(error) {
        // handle any errors
      }
    }
    

    ...

    <select
      multiple
      className="form-control"
      onChange={handleDropdownChange}
    >
      {ingredients.map((item) => (
        <option key={item.ingredient} value={item.ingredient}>
          {item.ingredient}
        </option>
      ))}
    </select>
    

    【讨论】:

    • 非常感谢您的回答,它确实有帮助,但看起来当我 console.log 选项时,我仍然可以在那里喝一杯。另外,我认为它不可能与常规通话一起使用?
    • @Razmi 嗯,我确实在代码盒中对此进行了测试,发现我可以记录所有选定的选项。您是在记录填充的selected 数组还是其他内容? “常规”API 调用看起来是同一个端点,只是 i queryString 参数上传递的值不同。
    • 我设法通过按 ctrl + click 选择多个元素,我认为 k 也是这样。关于“常规 API”,我的意思是如果我可以使用这个调用:“www.thecocktaildb.com/api/json/v1/1/filter.php?i=Gin”。因为我不允许使用付费的。有没有办法使用常规方法根据多个选定项目返回鸡尾酒?你真的帮了我很多,我很感谢你。
    • @Razmi 不,我不这么认为......我也试过了,但仍然只得到列表的第一个值的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 2016-07-07
    • 2023-02-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多