javascript - react : custom select element

标签 javascript reactjs

厌倦了 Firefox 丑陋的选择并且无法对其进行样式设置。 我想出于学习目的我应该在 React 中做一个。

它似乎很容易实现,但我不知道如何使用自定义组件执行 onChange 以及如何通过事件获取值。如果可能的话...

Select 组件如下所示:

type SelectProps = {
  select: {
    value: any
    options: {
      [k: string]: any
    }
  }
}

type SelectState = {
  show: boolean
}

class Select extends Component<SelectProps, SelectState> {
  constructor(props: SelectProps) {
    super(props)
    this.state = {
      show: false
    }
  }
  label = (v: any): string | undefined => {
    for (var k in this.props.select.options) {
      if (this.props.select.options[k] === v) return k
    }
  }
  change = (i: number) => {
    this.setState({ show: false })
    this.props.select.value = this.props.select.options[this.keys[i]]
  }
  display = () => {
    this.setState({ show: !this.state.show })
  }
  keys = Object.keys(this.props.select.options)
  render() {
    let { show } = this.state
    let { options, value } = this.props.select
    return (
      <div className='select'>
        <button onClick={this.display}>{this.label(value)}</button>
        {!show ? null :
          <ul>
            {this.keys.map((e: string, i: number) => (
              <li key={i} onClick={() => this.change(i)}>{e}</li>)
            )}
          </ul>
        }
      </div>
    )
  }
}

它按预期工作。我可以设计它(万岁!)。

我从 value 参数中获取选定的值。我想知道是否可以通过 onChange 事件获取它?所以它的行为更像是原生选择。

附注

这是它的样式(在手写笔中),以防需要

.select
  display: inline-block
  position: relative
  background: white
  button
    border: .1rem solid black
    min-width: 4rem
    min-height: 1.3rem
  ul
    position: absolute
    top: 100%
    border: .1rem solid black
    border-top: 0
    z-index: 100
    width: 100%
    background: inherit
    li
      text-align: center
      &:hover
        cursor: pointer
        background: grey

谢谢

最佳答案

作为 props 的一部分,传入更改回调。在change中,调用回调并传入新值:

type SelectProps = {
  select: {
    onChange: any, // change callback
    value: any,
    options: {
      [k: string]: any
    }
  }
}

...
...

change = (i: number) => {
  this.setState({ show: false })
  this.props.select.value = this.props.select.options[this.keys[i]]
  this.props.select.onChange(this.props.select.value); // call it
}

然后你可以在输出时传递你的更改回调:

let s = {
    value: '2',
    options: {
        '1' : 'one',
        '2' : 'two'  
    },
    onChange : function(val){
        console.log("change to " + val);
    }
};

return (
     <Select select={s} />
);

关于javascript - react : custom select element,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42850914/

相关文章:

javascript - 如何将任何 Unicode 字符输入到 sublime text 中?

javascript - 如何使用 javascript Lodash 将所有对象插入另一个数组

javascript - 如何在 Javascript 中设置页面的基本 href?

javascript - Todo like app中虚拟DOM的优势是什么

javascript - 状态(对象数组)更新后,React 不会刷新

javascript - 在 Sails.JS 中获取上传图像的下载 url

javascript - 在 Angular 应用程序中加载 Dojo 模块

javascript - 是否可以在validationSchema通过后进行更多的验证,是的,通过了吗?

javascript - 如何从 React hooks 返回父组件的回调?比如返回上传的url列表

javascript - 如何在 React 组件中使用解构