反应自定义事件

时间:2017-02-26 07:12:20

标签: reactjs react-jsx

在做出反应时,创建自定义事件的最佳方式是什么?

作为一个例子而不是:

readonly

能够做到这一点真好:

handleKeyPress: function(e) {
    if (e.key === 'Enter') {
        doSomething();
    }
}
...
<input onKeyPress={this.handleKeyPress} />

这可能吗?

我可以为<input onEnter={doSomething} /> 创建一个自定义包装器,但如果我想将其添加到<input><select>该怎么办?

3 个答案:

答案 0 :(得分:2)

您可以创建一个可以处理所有可能事件的基础组件,并扩展该组件以创建自定义元素,我会说这样更容易,因为您可以在一个类中使用所有事件,以备不时之需添加更多内容或更改某些行为。

&#13;
&#13;
class BaseElement extends React.Component {
  constructor(props){
    super(props);
    
    this.onEnter = this.onEnter.bind(this);
    this.onSpace = this.onSpace.bind(this);
    this.onKeyPress = this.onKeyPress.bind(this);
  }
  onEnter (e) {
    this.props.onEnter()
  }
  onSpace (e) {
    this.props.onSpace()
  }
  onKeyPress (e) {
    switch(e.key){
      case 'Enter':
        this.onEnter()
      break;
      case ' ':
        this.onSpace()
      break;
      default:
        this.props.onChange()
      break;
    }
  }
};

class CustomText extends BaseElement {
  render() {
    return (
      <input type='text' onKeyPress={this.onKeyPress} />
    )
  }
};


class App extends React.Component {
  render() {
     return (
         <CustomText onSpace={e => console.log('space')}
         onEnter={e => console.log('Enter')} />
     )
  }
}


ReactDOM.render(<App />, document.getElementById('app'))
&#13;
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.js"></script>
</head>
<body>
<div id='app'></div>
</body>
</html>
&#13;
&#13;
&#13;

答案 1 :(得分:2)

您无法将onEnter或任何其他自定义道具添加到标准dom元素中。但是,您可以将它们包装在自定义的React组件中:

const MyInput = ({onEnter}) => (
    <input onKeyPress={e => e.key === 'Enter' ? onEnter(e) : null } />
);

....

<MyInput onEnter={doSomething} />

答案 2 :(得分:2)

我只想编写一个实用程序包装器,它将操作作为参数并返回处理函数:

HttpSesssion session = request.getSession();

Map<String, String> productMap;
SampleResult result;

if (session.getAttribute("productMap") == null) {
    productMap = retrievedatafromDB();
    result = new SampleResult();
    sampleResult.setProductMap(productMap);
    session.setAttribute("productMap", result);// session attribute created
} else {
    result = session.getAttribute("productMap");// retrieve session attribute
    productMap = result.getProductMap();
}

然后导入它并在我想要的任何元素上使用它

function onEnter(action) {
    return function(e) {
        if (e.key === 'Enter') {
            action();
        }
    }
}