我具有以下功能组件
const input = props => (
<div>
<input placeholder="Type a message..." />
<div onClick={props.send} className="icon">
<i className="fa fa-play" />
</div>
</div>
)
如何将输入的值传递给props.send()
?
答案 0 :(得分:1)
有很多方法可以做到这一点,因为您非常担心性能。这是实现,仅当您单击发送按钮时才呈现您的组件,这实际上意味着状态将被更新一次并且输入值将显示在父组件中。
const Input = props => {
return (
<div>
<input onChange={props.changeHandler} placeholder="Type a message..." />
<button onClick={props.send}>send</button>
</div>
);
};
class App extends Component {
state = {
inputValue: ""
};
inputValue = '';
send = () => {
this.setState({ inputValue: this.inputValue });
};
changeHandler = event => {
this.inputValue = event.target.value;
};
render() {
console.log("In render");
return (
<React.Fragment>
<Input changeHandler={this.changeHandler} send={this.send} />
<div> {this.state.inputValue}</div>
</React.Fragment>
);
}
}
答案 1 :(得分:1)
由于您提到刚开始使用React,所以建议您仔细阅读 documentation (提供了很好的解释)。
根据您的评论,不需要使用功能组件。因此,我建议采用这种方式->
您的CustomInput
组件:
import React from "react";
import PropTypes from "prop-types";
class CustomInput extends React.Component {
constructor() {
super();
this.textInput = React.createRef();
}
static propTypes = {
send: PropTypes.func
};
render() {
const { send } = this.props;
return (
<React.Fragment>
<input placeholder="Type a message..." ref={this.textInput} />
<div
onClick={() => send(this.textInput.current.value)}
className="icon"
>
CLICK ME
</div>
</React.Fragment>
);
}
}
export default CustomInput;
如果您注意到了,我将空div
替换为React.Fragment
。在这种情况下,您可以省略不必要的<div>
包装(如果不需要),这样可以使您的DOM保持整洁(有关详细信息,请 here 。
用法:
<CustomInput
send={(prop) => {
console.log(prop)
}}
/>
我只是使用了一个虚拟函数,它将输入值记录到控制台。
您可以检查工作示例(确保在编辑器中触发console
) here
答案 2 :(得分:0)
我在React的官方文档https://reactjs.org/docs/refs-and-the-dom.html#refs-and-functional-components
上找到了针对此确切场景的解决方案这种方法使您的组件保持无状态,也不需要每次更改都更新父组件。
基本上,
const input = props => {
let textInput = React.createRef();
function handleClick() {
console.log(textInput.current.value);
}
return (
<div>
<input ref={textInput} placeholder="Type a message..." />
<div onClick={handleClick} className="icon">
<i className="fa fa-play" />
</div>
</div>
)
}