为了账号安全,请及时绑定邮箱和手机立即绑定

Downshift:将 inputValue 设置为键盘导航上当前突出显示的项目的值

Downshift:将 inputValue 设置为键盘导航上当前突出显示的项目的值

天涯尽头无女友 2022-06-16 17:14:26
使用 Downshift,如何实现将 设置为inputValueArrowUp/ArrowDown 上当前突出显示的项目的值,同时保留过滤的项目,直到用户手动增加inputValue?例如:
查看完整描述

1 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

上述行为可以利用stateReduceranduseCombobox钩子实现,如下所示:


import React, { useState } from "react";

import { render } from "react-dom";

import { useCombobox } from "downshift";

import { items, menuStyles } from "./utils";


function stateReducer(state, actionAndChanges) {

  switch (actionAndChanges.type) {

    case useCombobox.stateChangeTypes.InputChange:

      return {

        ...actionAndChanges.changes,

        userInput: actionAndChanges.changes.inputValue

      };

    case useCombobox.stateChangeTypes.InputKeyDownArrowDown:

    case useCombobox.stateChangeTypes.InputKeyDownArrowUp:

      if (!actionAndChanges.changes.inputValue) return actionAndChanges.changes;


      return {

        ...actionAndChanges.changes,

        userInput: actionAndChanges.changes.inputValue,

        inputValue: actionAndChanges.getItemNodeFromIndex(

          actionAndChanges.changes.highlightedIndex

        ).innerText

      };

    default:

      return actionAndChanges.changes; // otherwise business as usual.

  }

}


function DropdownSelect() {

  const [inputItems, setInputItems] = useState(items);

  const {

    isOpen,

    getToggleButtonProps,

    getLabelProps,

    getMenuProps,

    getInputProps,

    getComboboxProps,

    highlightedIndex,

    getItemProps

  } = useCombobox({

    items: inputItems,

    stateReducer,

    onInputValueChange: ({ userInput, inputValue }) => {

      if (userInput === inputValue) {

        const filteredItems = items.filter(item =>

          item.toLowerCase().startsWith(inputValue.toLowerCase())

        );

        setInputItems(filteredItems);

      }

    }

  });


  return (

    <React.Fragment>

      <label {...getLabelProps()}>Choose an element:</label>

      <div style={{ display: "inline-block" }} {...getComboboxProps()}>

        <input {...getInputProps()} />

        <button {...getToggleButtonProps()} aria-label="toggle menu">

          &#8595;

        </button>

      </div>

      <ul {...getMenuProps()} style={menuStyles}>

        {isOpen &&

          inputItems.map((item, index) => (

            <li

              style={

                highlightedIndex === index ? { backgroundColor: "#bde4ff" } : {}

              }

              key={`${item}${index}`}

              {...getItemProps({ item, index })}

            >

              {item}

            </li>

          ))}

      </ul>

    </React.Fragment>

  );

}


render(<DropdownSelect />, document.getElementById("root"));



查看完整回答
反对 回复 2022-06-16
  • 1 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信