美文网首页
级联选择器

级联选择器

作者: sweetBoy_9126 | 来源:发表于2020-01-19 11:40 被阅读0次

初始数据结构:

const options = [
  {
    value: 'zhejiang',
    label: 'Zhejiang',
    children: [
      {
        value: 'hangzhou',
        label: 'Hangzhou',
        children: [
          {
            value: 'xihu',
            label: 'West Lake',
          },
        ],
      },
    ],
  },
  {
    value: 'jiangsu',
    label: 'Jiangsu',
    children: [
      {
        value: 'nanjing',
        label: 'Nanjing',
        children: [
          {
            value: 'zhonghuamen',
            label: 'Zhong Hua Men',
          },
        ],
      },
    ],
  },
];

结构:我们每次点击一个面板的时候会显示另一个面板,初始化的时候始终显示一个面板,所以我们可以把我们开始的数据结构进行修改,我们可以修改成一个二维数组,每次点击的时候在这个二维数组里把当前项的children再添加进这个数组里,也就是一开始的时候把所有的数据都放在数组里
[options,item.children]

const Cascader: React.FunctionComponent<cascaderOptions> = (props) => {
  const [visible, setVisible] = useState(false)
  const [list, setList] = useState<doubleArrOptions | any>([])
  const initOptions: Options | doubleArrOptions = props.options
const selectInit = () => {
    setInputValue('')
    initOptionList()
  }
  const initOptionList = () => {
    setList([[...props.options]])
  }
  useEffect(() => {
    window.addEventListener('click', onClickDocument, false)
    if (props.options && props.options.length > 0) {
      (!defaultValue || defaultValue.length === 0) && initOptionList()
    }
    props.defaultValue && setInputValue(props.defaultValue.join('/'))
    return () => window.removeEventListener('click', onClickDocument)
  }, [])
  return (
    <C.Provider value={{list, setList, initOptions, onChange, setInputValue, setVisible, defaultValue, fieldNames}}>
      <div className={sc('')} ref={wrapperRef}>
        <div className={sc('wrapper')} onMouseEnter={() => setVisibleClose(true)}
          onMouseLeave={() => setVisibleClose(false)}
        >
          <Input onClick={(e) => onClick(e)} onChange={onInputChange} value={inputValue} readOnly placeholder={props.placeholder}
            style={{width: '300px'}}
          />
          {
            inputValue && visibleClose ?
              <Icon name="close" onClick={selectInit}/> :
              <Icon name="bottom" className={sc({'icon-active': visible})}/>
          }
        </div>
        <div className={sc({'menus': true, 'visible': visible})}
        >
          <Menus options={list}/>
        </div>
      </div>
    </C.Provider>
  )
}
const Menus: React.FunctionComponent<cascaderOptions> = ({options}) => {
  let copyList = JSON.parse(JSON.stringify(list))
const onClickList = (item: cascaderProp, index: number) => {
    // 如果点击的是第一层就把所有的数据初始化,否则就截取第0项到当前这项
    copyList = index === 0 ? [[...initOptions]] : copyList.slice(0, index + 1)
    setList(copyList)
  }
  return (
    <Fragment>
      {list.map((node: Options, index: number) =>
        <ul className={sc('menu')} key={index}>
          {node.map((menu: cascaderProp) =>
            <li className={sc({'menu-item': true, 'active': menu.active === true})} key={menu[fieldNames.label]} onClick={() => onClickList(menu, index)}>
              {menu[fieldNames.label]}
              {menu[fieldNames.children] && menu[fieldNames.children].length > 0 ? <Icon name="right" className={sc('menu-item-icon')}/> : null}
            </li>
          )}
        </ul>
      )}
    </Fragment>
  )
}

相关文章

网友评论

      本文标题:级联选择器

      本文链接:https://www.haomeiwen.com/subject/kdrrzctx.html