我们假设您有以下功能(或更多):
function hasValue(element) {
return (element.value && element.value.length);
}
function isLongerThan(element, minLength){
return element.value.length > minLength;
}
您如何尝试通过道具将这些函数列表传递给组件?
我尝试过类似的事情:
<MyInputComponent runThese={[hasValue, isLongerThan]} />
或
<MyInputComponent runThese={[() => hasValue(), () => isLongerThan()]} />
但这些函数需要element
参数(MyComponent的子节点)以及其他可用的参数。
任何帮助将不胜感激。谢谢!
答案 0 :(得分:1)
您可以使用以下语法
<MyInputComponent runThese={[(element) => hasValue(element), (element) => isLongerThan(element, 23)]} />
在这里,您可以从子组件传递元素,如下所示
const {runThese : [hasValue, isLongerThan]} = this.props;
hasValue('el');
isLongerThan('el');
答案 1 :(得分:1)
这是一个示例,说明如何将函数传递给组件并运行它们。我们在数组中传递了2个函数hasValue
和isLongerThan
。然后我们设置一个onChange
事件监听器来调用数组中的函数。如果所有输入函数都通过(返回true
),我们将输入的状态设置为valid
。
在isLongerThan
的情况下,我们将创建一个函数来返回一个函数,因此我们可以设置minLength
值。
运行下面的代码段,然后在输入中输入一些值。您将看到false
已记录,直到输入值的长度大于3。
function hasValue(element) {
return (element.value && element.value.length);
}
function isLongerThan(minLength) {
return function(element) {
return element.value.length > minLength;
}
}
class MyInputComponent extends React.Component {
constructor(props) {
super(props)
this.state = {
valid: false
}
}
handleChange = (event) => {
this.setState({
valid: this.props.runThese.every(func => func(event.currentTarget))
})
}
render() {
return (
<input type="text" onChange={this.handleChange} className={(this.state.valid ? 'valid': 'invalid' )}/>
)
}
}
ReactDOM.render( <MyInputComponent runThese={[hasValue, isLongerThan(3)]} />, document.getElementById("app"))
input {
outline: none;
}
.valid {
border: 3px solid green;
}
.invalid {
border: 3px solid red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>