admin管理员组文章数量:1391943
Here is what I tried, and details what I want to achieve, can someone help.
class ConfirmDialog extends React.Component {
callback(action){
alert(action)
}
render(){
return(
<div className='dialog'>
<div>confirm dialog</div>
<button onClick={() => this.callback('yes')}>Yes</button>
<button onClick={() => this.callback('no')}>No</button>
</div>
)
}
}
class Hello extends React.Component {
constructor(props){
super(props);
this.state = {
showDialog: false,
}
}
onButtonClick(params) {
//I want yes no callback here without loosing my previous params
//so i can use switch case here for yes / no action.
this.setState({showDialog: !this.state.showDialog})
}
render() {
return (
<div>
<button onClick={() => this.onButtonClick({test: 'test params'})}>
Click</button>
{
this.state.showDialog ?
<ConfirmDialog callback={this.onButtonClick}/> : null
}
</div>
)
}
}
ReactDOM.render(
<Hello />,
document.getElementById('container')
);
.dialog {
background: tomato;
width: 150px;
height: 150px;
margin: auto;
}
.dialog button {
display : inline-block;
text-align: center;
margin: 0 10px;
}
<script src=".6.3/umd/react.production.min.js"></script>
<script src=".6.3/umd/react-dom.production.min.js"></script>
<div id="container">
<!-- This element's contents will be replaced with your ponent. -->
</div>
Here is what I tried, and details what I want to achieve, can someone help.
class ConfirmDialog extends React.Component {
callback(action){
alert(action)
}
render(){
return(
<div className='dialog'>
<div>confirm dialog</div>
<button onClick={() => this.callback('yes')}>Yes</button>
<button onClick={() => this.callback('no')}>No</button>
</div>
)
}
}
class Hello extends React.Component {
constructor(props){
super(props);
this.state = {
showDialog: false,
}
}
onButtonClick(params) {
//I want yes no callback here without loosing my previous params
//so i can use switch case here for yes / no action.
this.setState({showDialog: !this.state.showDialog})
}
render() {
return (
<div>
<button onClick={() => this.onButtonClick({test: 'test params'})}>
Click</button>
{
this.state.showDialog ?
<ConfirmDialog callback={this.onButtonClick}/> : null
}
</div>
)
}
}
ReactDOM.render(
<Hello />,
document.getElementById('container')
);
.dialog {
background: tomato;
width: 150px;
height: 150px;
margin: auto;
}
.dialog button {
display : inline-block;
text-align: center;
margin: 0 10px;
}
<script src="https://cdnjs.cloudflare./ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare./ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="container">
<!-- This element's contents will be replaced with your ponent. -->
</div>
Share Improve this question asked Jan 22, 2019 at 14:34 Mahendra KulkarniMahendra Kulkarni 1,5173 gold badges26 silver badges37 bronze badges 2The on callback function should get which action I clicked and without losing the parameters. React JS - confirmation dialog with function callback with the action without loosing the previous parameter
- Check my answer I added and working sample: codesandbox.io/s/r09z191w3p – Nedko Dimitrov Commented Jan 22, 2019 at 15:03
- Here you were missing to call props function, instead you called local function. <button onClick={() => this.callback('yes')}>Yes</button> <button onClick={() => this.callback('no')}>No</button> – Mahendra Kulkarni Commented Jul 23, 2021 at 14:21
4 Answers
Reset to default 2You're not passing the props correctly to the ConfigComponent. You Need to use the class constructor
and call super
on the props.
class ConfirmDialog extends React.Component {
constructor(props) {
super(props)
}
callback(action){
alert(action)
}
render(){
return(
<div className='dialog'>
<div>confirm dialog</div>
<button onClick={() => this.props.callback('yes')}>Yes</button>
<button onClick={() => this.props.callback('no')}>No</button>
</div>
)
}
}
And now in your Hello ponent you can work with the value of the callback
class Hello extends React.Component {
constructor(props){
super(props);
this.state = {
showDialog: false,
}
}
onButtonClick(yesOrNo) {
//I want yes no callback here without loosing my previous params
//so i can use switch case here for yes / no action.
console.log(yesOrNo)
this.setState({showDialog: !this.state.showDialog})
}
render() {
return (
<div>
<button onClick={() => this.onButtonClick({test: 'test params'})}>
Click</button>
{
this.state.showDialog ?
<ConfirmDialog callback={this.onButtonClick.bind(this)}/> : null
}
</div>
)
}
}
ReactDOM.render(
<Hello />,
document.getElementById('container')
);
Here is working example https://codesandbox.io/s/r09z191w3p
You have to use the callback function passed through the ponents props:
<button onClick={() => this.props.callback('yes')}>Yes</button>
<button onClick={() => this.props.callback('no')}>No</button>
You can add a function in the props of your ConfirmDialog ponent
<ConfirmDialog callback={this.onSelection}/>
and call it when the "yes" or "no" button is clicked
this.props.callback(action);
You now have your value inside the onSelection
function.
class ConfirmDialog extends React.Component {
callback(action){
this.props.callback(action);
}
render(){
return(
<div className='dialog'>
<div>confirm dialog</div>
<button onClick={() => this.callback('yes')}>Yes</button>
<button onClick={() => this.callback('no')}>No</button>
</div>
)
}
}
class Hello extends React.Component {
constructor(props){
super(props);
this.state = {
showDialog: false,
}
}
onSelection(value) {
console.log("My dialog value is :", value); //Value contains "yes" or "no"
//set value to state or use it here
}
onButtonClick(params) {
this.setState({showDialog: !this.state.showDialog})
}
render() {
return (
<div>
<button onClick={() => this.onButtonClick({test: 'test params'})}>Click</button>
{
this.state.showDialog ?
<ConfirmDialog callback={this.onSelection}/>
:
null
}
</div>
)
}
}
ReactDOM.render(
<Hello />,
document.getElementById('container')
);
.dialog {
background: tomato;
width: 150px;
height: 150px;
margin: auto;
}
.dialog button {
display: inline-block;
text-align: center;
margin: 0 10px;
}
<script src="https://cdnjs.cloudflare./ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare./ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="container">
<!-- This element's contents will be replaced with your ponent. -->
</div>
In order to better manage your react code, incorporate PropTypes in your code. https://www.npmjs./package/prop-types
Add a types for callback:
ConfirmDialog.propTypes = {
yesCallback: PropTypes.func,
noCallback: PropTypes.func
};
Use the callback in your Confirm Dialog Component
<button onClick={() => this.props.yesCallback("Yes")}>Yes</button>
<button onClick={() => this.props.noCallback("No")}>No</button>
Pass props from parent ponents
<ConfirmDialog
yesCallback={message => {
alert(message);
}}
noCallback={message => {
alert(message);
}}
/>
本文标签: javascriptReact JSconfirmation dialog with function callbackStack Overflow
版权声明:本文标题:javascript - React JS - confirmation dialog with function callback - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744665844a2618526.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论