Refactor problem, tring to inject function but fail
I'm using react to create a test component, which is used in ContainerA and ContainerB.
test component:
renderTitle(){
let mode = this.modeType[this.state.mode];
switch (mode){
case 'A':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>A</div>
</div>;
break;
case 'B':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>B</div>
</div>;
break;
case 'C':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>C</div>
</div>;
break;
case 'D':
title =
<div>
<div>D</div>
</div>;
break;
}
return(
<div className="d-flex justify-content-around">
{title}
</div>
);
}
And I found that mode A,B,C will only used in ContainerA and mode D will only used in ContainerB.
So I tried to refactor test component into following:
renderTitle(){
let mode = this.modeType[this.state.mode];
let title = this.props.setTitle(mode);
return(
<div className="d-flex justify-content-around">
{title}
</div>
);
}
And change container like following:
ContainerA
export class ContainerA extends Component{
setTitle(mode){
switch (mode){
case 'A':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>A</div>
</div>;
break;
case 'B':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>B</div>
</div>;
break;
case 'C':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>C</div>
</div>;
break;
}
return title
}
render(){
return(
<div >
<Test setTitle={this.setTitle.bind(this)}/>
</div>
)
}
}
ContainerB
export class ContainerA extends Component{
setTitle(mode){
let test=
<div>
<div>D</div>
</div>;
return title
}
render(){
return(
<div >
<Test setTitle={this.setTitle.bind(this)}/>
</div>
)
}
}
But switchMode() is inside the test component, so how to set the onClick event handler?
reactjs refactoring
add a comment |
I'm using react to create a test component, which is used in ContainerA and ContainerB.
test component:
renderTitle(){
let mode = this.modeType[this.state.mode];
switch (mode){
case 'A':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>A</div>
</div>;
break;
case 'B':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>B</div>
</div>;
break;
case 'C':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>C</div>
</div>;
break;
case 'D':
title =
<div>
<div>D</div>
</div>;
break;
}
return(
<div className="d-flex justify-content-around">
{title}
</div>
);
}
And I found that mode A,B,C will only used in ContainerA and mode D will only used in ContainerB.
So I tried to refactor test component into following:
renderTitle(){
let mode = this.modeType[this.state.mode];
let title = this.props.setTitle(mode);
return(
<div className="d-flex justify-content-around">
{title}
</div>
);
}
And change container like following:
ContainerA
export class ContainerA extends Component{
setTitle(mode){
switch (mode){
case 'A':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>A</div>
</div>;
break;
case 'B':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>B</div>
</div>;
break;
case 'C':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>C</div>
</div>;
break;
}
return title
}
render(){
return(
<div >
<Test setTitle={this.setTitle.bind(this)}/>
</div>
)
}
}
ContainerB
export class ContainerA extends Component{
setTitle(mode){
let test=
<div>
<div>D</div>
</div>;
return title
}
render(){
return(
<div >
<Test setTitle={this.setTitle.bind(this)}/>
</div>
)
}
}
But switchMode() is inside the test component, so how to set the onClick event handler?
reactjs refactoring
add a comment |
I'm using react to create a test component, which is used in ContainerA and ContainerB.
test component:
renderTitle(){
let mode = this.modeType[this.state.mode];
switch (mode){
case 'A':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>A</div>
</div>;
break;
case 'B':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>B</div>
</div>;
break;
case 'C':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>C</div>
</div>;
break;
case 'D':
title =
<div>
<div>D</div>
</div>;
break;
}
return(
<div className="d-flex justify-content-around">
{title}
</div>
);
}
And I found that mode A,B,C will only used in ContainerA and mode D will only used in ContainerB.
So I tried to refactor test component into following:
renderTitle(){
let mode = this.modeType[this.state.mode];
let title = this.props.setTitle(mode);
return(
<div className="d-flex justify-content-around">
{title}
</div>
);
}
And change container like following:
ContainerA
export class ContainerA extends Component{
setTitle(mode){
switch (mode){
case 'A':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>A</div>
</div>;
break;
case 'B':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>B</div>
</div>;
break;
case 'C':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>C</div>
</div>;
break;
}
return title
}
render(){
return(
<div >
<Test setTitle={this.setTitle.bind(this)}/>
</div>
)
}
}
ContainerB
export class ContainerA extends Component{
setTitle(mode){
let test=
<div>
<div>D</div>
</div>;
return title
}
render(){
return(
<div >
<Test setTitle={this.setTitle.bind(this)}/>
</div>
)
}
}
But switchMode() is inside the test component, so how to set the onClick event handler?
reactjs refactoring
I'm using react to create a test component, which is used in ContainerA and ContainerB.
test component:
renderTitle(){
let mode = this.modeType[this.state.mode];
switch (mode){
case 'A':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>A</div>
</div>;
break;
case 'B':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>B</div>
</div>;
break;
case 'C':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>C</div>
</div>;
break;
case 'D':
title =
<div>
<div>D</div>
</div>;
break;
}
return(
<div className="d-flex justify-content-around">
{title}
</div>
);
}
And I found that mode A,B,C will only used in ContainerA and mode D will only used in ContainerB.
So I tried to refactor test component into following:
renderTitle(){
let mode = this.modeType[this.state.mode];
let title = this.props.setTitle(mode);
return(
<div className="d-flex justify-content-around">
{title}
</div>
);
}
And change container like following:
ContainerA
export class ContainerA extends Component{
setTitle(mode){
switch (mode){
case 'A':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>A</div>
</div>;
break;
case 'B':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>B</div>
</div>;
break;
case 'C':
title =
<div onClick={this.switchMode.bind(this,'next')}>
<div>C</div>
</div>;
break;
}
return title
}
render(){
return(
<div >
<Test setTitle={this.setTitle.bind(this)}/>
</div>
)
}
}
ContainerB
export class ContainerA extends Component{
setTitle(mode){
let test=
<div>
<div>D</div>
</div>;
return title
}
render(){
return(
<div >
<Test setTitle={this.setTitle.bind(this)}/>
</div>
)
}
}
But switchMode() is inside the test component, so how to set the onClick event handler?
reactjs refactoring
reactjs refactoring
asked Nov 22 '18 at 3:00
jimmyjimmy
2741214
2741214
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
A solution I use to call a function in a parent component, from an event that is handled inside a child component, is the following.
Parent Class
class Parent extends React.Component {
actualEvent(data) {
// do something here
}
render() {
return <Child onClick={this.actualEvent.bind(this)}/>
}
}
Child Class
class Child extends React.Component {
onClick(evt) {
if (this.props.onClick)
this.props.onClick(/* some data if required */);
}
render() {
return (
<div onClick={this.onClick.bind(this)}>whatever</div>
)
}
}
basically, the idea is in the child component where the actual event happens, you call a function that you apply as a property from the parent.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53423262%2frefactor-problem-tring-to-inject-function-but-fail%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
A solution I use to call a function in a parent component, from an event that is handled inside a child component, is the following.
Parent Class
class Parent extends React.Component {
actualEvent(data) {
// do something here
}
render() {
return <Child onClick={this.actualEvent.bind(this)}/>
}
}
Child Class
class Child extends React.Component {
onClick(evt) {
if (this.props.onClick)
this.props.onClick(/* some data if required */);
}
render() {
return (
<div onClick={this.onClick.bind(this)}>whatever</div>
)
}
}
basically, the idea is in the child component where the actual event happens, you call a function that you apply as a property from the parent.
add a comment |
A solution I use to call a function in a parent component, from an event that is handled inside a child component, is the following.
Parent Class
class Parent extends React.Component {
actualEvent(data) {
// do something here
}
render() {
return <Child onClick={this.actualEvent.bind(this)}/>
}
}
Child Class
class Child extends React.Component {
onClick(evt) {
if (this.props.onClick)
this.props.onClick(/* some data if required */);
}
render() {
return (
<div onClick={this.onClick.bind(this)}>whatever</div>
)
}
}
basically, the idea is in the child component where the actual event happens, you call a function that you apply as a property from the parent.
add a comment |
A solution I use to call a function in a parent component, from an event that is handled inside a child component, is the following.
Parent Class
class Parent extends React.Component {
actualEvent(data) {
// do something here
}
render() {
return <Child onClick={this.actualEvent.bind(this)}/>
}
}
Child Class
class Child extends React.Component {
onClick(evt) {
if (this.props.onClick)
this.props.onClick(/* some data if required */);
}
render() {
return (
<div onClick={this.onClick.bind(this)}>whatever</div>
)
}
}
basically, the idea is in the child component where the actual event happens, you call a function that you apply as a property from the parent.
A solution I use to call a function in a parent component, from an event that is handled inside a child component, is the following.
Parent Class
class Parent extends React.Component {
actualEvent(data) {
// do something here
}
render() {
return <Child onClick={this.actualEvent.bind(this)}/>
}
}
Child Class
class Child extends React.Component {
onClick(evt) {
if (this.props.onClick)
this.props.onClick(/* some data if required */);
}
render() {
return (
<div onClick={this.onClick.bind(this)}>whatever</div>
)
}
}
basically, the idea is in the child component where the actual event happens, you call a function that you apply as a property from the parent.
answered Nov 22 '18 at 4:16
demitchell14demitchell14
83119
83119
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53423262%2frefactor-problem-tring-to-inject-function-but-fail%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown