React router v4 parameter going as undefined











up vote
1
down vote

favorite












I have a route config like this:
/${URL.PRODUCT}/:category/:brand/:flavour/, with exact={true} and it loads the Product component.



On Product component I have this:



    constructor(props) {
super(props)
this.state = {
selectedCategory: props.match.params.category || '',
selectedFlavour: props.match.params.flavour || '',
selectedBrand: props.match.params.brand || '',
}
s("PARAMS", JSON.stringify(props.match.params)); //console on server
c("PARAMS", JSON.stringify(props.match.params)); // console on browser
}


Now, on some other component I have a click event, which does this:



clickHandler = (cardData) => {
let path = `/${URL.PRODUCT}/${cardData.selectedCategory}/${cardData.selectedCard}/${cardData.slug}`;
cardData.type === CONTENT_TYPE.FLAVOUR && !!cardData.slug && this.props.history.push(path);
}


And cardData looks like this:



{
id: 3
image: "/some/imagepath/"
name: "Diet Coke"
selectedCard: "cocacola"
selectedCategory: "softdrinnk"
slug: "dietcoke"
type: "flavour"
}


Its resulting in something like this: /product/softdrinnk/cocacola/dietcoke



Now the problem: As I am hitting this.props.history.push() its making a server call (which it should not) also, with a wrong URL: /product/softdrinnk/cocacola/undefined



This is what my console looks like on client:



PARAMS {"category":"softdrinnk","brand":"cocacola","flavour":"dietcoke"}



And this is what I receive on server:



PARAMS {"category":"softdrinnk","brand":"cocacola","flavour":"undefined"}



I have spend the whole day figuring out why this behaviour is happening.



Update:



Even if when I hardcoded the URL: /${URL.PRODUCT}/${cardData.selectedCategory}/${cardData.selectedCard}/dietcoke, Its ignoring the last parameter and still and passing undefined to the server



And when I hit browser refresh on this route, it works normally and loads all the data










share|improve this question
























  • What does cardData look like? You have selectedCategory, selectedFlavour, selectedBrand in state, but only selectedCategory of those in cardData?
    – Tholle
    Nov 9 at 13:31












  • @Tholle updated that in my question
    – Saurabh Sharma
    Nov 9 at 13:35










  • Thanks. Is your click handler on a button inside a form? You might have to do clickHandler = (event, cardData) => { event.preventDefault(); ... } if that's the case.
    – Tholle
    Nov 9 at 13:36






  • 1




    That's not in a form, its just another component with an onCLick event
    – Saurabh Sharma
    Nov 9 at 13:37















up vote
1
down vote

favorite












I have a route config like this:
/${URL.PRODUCT}/:category/:brand/:flavour/, with exact={true} and it loads the Product component.



On Product component I have this:



    constructor(props) {
super(props)
this.state = {
selectedCategory: props.match.params.category || '',
selectedFlavour: props.match.params.flavour || '',
selectedBrand: props.match.params.brand || '',
}
s("PARAMS", JSON.stringify(props.match.params)); //console on server
c("PARAMS", JSON.stringify(props.match.params)); // console on browser
}


Now, on some other component I have a click event, which does this:



clickHandler = (cardData) => {
let path = `/${URL.PRODUCT}/${cardData.selectedCategory}/${cardData.selectedCard}/${cardData.slug}`;
cardData.type === CONTENT_TYPE.FLAVOUR && !!cardData.slug && this.props.history.push(path);
}


And cardData looks like this:



{
id: 3
image: "/some/imagepath/"
name: "Diet Coke"
selectedCard: "cocacola"
selectedCategory: "softdrinnk"
slug: "dietcoke"
type: "flavour"
}


Its resulting in something like this: /product/softdrinnk/cocacola/dietcoke



Now the problem: As I am hitting this.props.history.push() its making a server call (which it should not) also, with a wrong URL: /product/softdrinnk/cocacola/undefined



This is what my console looks like on client:



PARAMS {"category":"softdrinnk","brand":"cocacola","flavour":"dietcoke"}



And this is what I receive on server:



PARAMS {"category":"softdrinnk","brand":"cocacola","flavour":"undefined"}



I have spend the whole day figuring out why this behaviour is happening.



Update:



Even if when I hardcoded the URL: /${URL.PRODUCT}/${cardData.selectedCategory}/${cardData.selectedCard}/dietcoke, Its ignoring the last parameter and still and passing undefined to the server



And when I hit browser refresh on this route, it works normally and loads all the data










share|improve this question
























  • What does cardData look like? You have selectedCategory, selectedFlavour, selectedBrand in state, but only selectedCategory of those in cardData?
    – Tholle
    Nov 9 at 13:31












  • @Tholle updated that in my question
    – Saurabh Sharma
    Nov 9 at 13:35










  • Thanks. Is your click handler on a button inside a form? You might have to do clickHandler = (event, cardData) => { event.preventDefault(); ... } if that's the case.
    – Tholle
    Nov 9 at 13:36






  • 1




    That's not in a form, its just another component with an onCLick event
    – Saurabh Sharma
    Nov 9 at 13:37













up vote
1
down vote

favorite









up vote
1
down vote

favorite











I have a route config like this:
/${URL.PRODUCT}/:category/:brand/:flavour/, with exact={true} and it loads the Product component.



On Product component I have this:



    constructor(props) {
super(props)
this.state = {
selectedCategory: props.match.params.category || '',
selectedFlavour: props.match.params.flavour || '',
selectedBrand: props.match.params.brand || '',
}
s("PARAMS", JSON.stringify(props.match.params)); //console on server
c("PARAMS", JSON.stringify(props.match.params)); // console on browser
}


Now, on some other component I have a click event, which does this:



clickHandler = (cardData) => {
let path = `/${URL.PRODUCT}/${cardData.selectedCategory}/${cardData.selectedCard}/${cardData.slug}`;
cardData.type === CONTENT_TYPE.FLAVOUR && !!cardData.slug && this.props.history.push(path);
}


And cardData looks like this:



{
id: 3
image: "/some/imagepath/"
name: "Diet Coke"
selectedCard: "cocacola"
selectedCategory: "softdrinnk"
slug: "dietcoke"
type: "flavour"
}


Its resulting in something like this: /product/softdrinnk/cocacola/dietcoke



Now the problem: As I am hitting this.props.history.push() its making a server call (which it should not) also, with a wrong URL: /product/softdrinnk/cocacola/undefined



This is what my console looks like on client:



PARAMS {"category":"softdrinnk","brand":"cocacola","flavour":"dietcoke"}



And this is what I receive on server:



PARAMS {"category":"softdrinnk","brand":"cocacola","flavour":"undefined"}



I have spend the whole day figuring out why this behaviour is happening.



Update:



Even if when I hardcoded the URL: /${URL.PRODUCT}/${cardData.selectedCategory}/${cardData.selectedCard}/dietcoke, Its ignoring the last parameter and still and passing undefined to the server



And when I hit browser refresh on this route, it works normally and loads all the data










share|improve this question















I have a route config like this:
/${URL.PRODUCT}/:category/:brand/:flavour/, with exact={true} and it loads the Product component.



On Product component I have this:



    constructor(props) {
super(props)
this.state = {
selectedCategory: props.match.params.category || '',
selectedFlavour: props.match.params.flavour || '',
selectedBrand: props.match.params.brand || '',
}
s("PARAMS", JSON.stringify(props.match.params)); //console on server
c("PARAMS", JSON.stringify(props.match.params)); // console on browser
}


Now, on some other component I have a click event, which does this:



clickHandler = (cardData) => {
let path = `/${URL.PRODUCT}/${cardData.selectedCategory}/${cardData.selectedCard}/${cardData.slug}`;
cardData.type === CONTENT_TYPE.FLAVOUR && !!cardData.slug && this.props.history.push(path);
}


And cardData looks like this:



{
id: 3
image: "/some/imagepath/"
name: "Diet Coke"
selectedCard: "cocacola"
selectedCategory: "softdrinnk"
slug: "dietcoke"
type: "flavour"
}


Its resulting in something like this: /product/softdrinnk/cocacola/dietcoke



Now the problem: As I am hitting this.props.history.push() its making a server call (which it should not) also, with a wrong URL: /product/softdrinnk/cocacola/undefined



This is what my console looks like on client:



PARAMS {"category":"softdrinnk","brand":"cocacola","flavour":"dietcoke"}



And this is what I receive on server:



PARAMS {"category":"softdrinnk","brand":"cocacola","flavour":"undefined"}



I have spend the whole day figuring out why this behaviour is happening.



Update:



Even if when I hardcoded the URL: /${URL.PRODUCT}/${cardData.selectedCategory}/${cardData.selectedCard}/dietcoke, Its ignoring the last parameter and still and passing undefined to the server



And when I hit browser refresh on this route, it works normally and loads all the data







reactjs react-router-v4






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 9 at 13:48

























asked Nov 9 at 13:25









Saurabh Sharma

1,74421034




1,74421034












  • What does cardData look like? You have selectedCategory, selectedFlavour, selectedBrand in state, but only selectedCategory of those in cardData?
    – Tholle
    Nov 9 at 13:31












  • @Tholle updated that in my question
    – Saurabh Sharma
    Nov 9 at 13:35










  • Thanks. Is your click handler on a button inside a form? You might have to do clickHandler = (event, cardData) => { event.preventDefault(); ... } if that's the case.
    – Tholle
    Nov 9 at 13:36






  • 1




    That's not in a form, its just another component with an onCLick event
    – Saurabh Sharma
    Nov 9 at 13:37


















  • What does cardData look like? You have selectedCategory, selectedFlavour, selectedBrand in state, but only selectedCategory of those in cardData?
    – Tholle
    Nov 9 at 13:31












  • @Tholle updated that in my question
    – Saurabh Sharma
    Nov 9 at 13:35










  • Thanks. Is your click handler on a button inside a form? You might have to do clickHandler = (event, cardData) => { event.preventDefault(); ... } if that's the case.
    – Tholle
    Nov 9 at 13:36






  • 1




    That's not in a form, its just another component with an onCLick event
    – Saurabh Sharma
    Nov 9 at 13:37
















What does cardData look like? You have selectedCategory, selectedFlavour, selectedBrand in state, but only selectedCategory of those in cardData?
– Tholle
Nov 9 at 13:31






What does cardData look like? You have selectedCategory, selectedFlavour, selectedBrand in state, but only selectedCategory of those in cardData?
– Tholle
Nov 9 at 13:31














@Tholle updated that in my question
– Saurabh Sharma
Nov 9 at 13:35




@Tholle updated that in my question
– Saurabh Sharma
Nov 9 at 13:35












Thanks. Is your click handler on a button inside a form? You might have to do clickHandler = (event, cardData) => { event.preventDefault(); ... } if that's the case.
– Tholle
Nov 9 at 13:36




Thanks. Is your click handler on a button inside a form? You might have to do clickHandler = (event, cardData) => { event.preventDefault(); ... } if that's the case.
– Tholle
Nov 9 at 13:36




1




1




That's not in a form, its just another component with an onCLick event
– Saurabh Sharma
Nov 9 at 13:37




That's not in a form, its just another component with an onCLick event
– Saurabh Sharma
Nov 9 at 13:37

















active

oldest

votes











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',
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
});


}
});














 

draft saved


draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53226578%2freact-router-v4-parameter-going-as-undefined%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown






























active

oldest

votes













active

oldest

votes









active

oldest

votes






active

oldest

votes
















 

draft saved


draft discarded



















































 


draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53226578%2freact-router-v4-parameter-going-as-undefined%23new-answer', 'question_page');
}
);

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







Popular posts from this blog

Schultheiß

Android Play Services Check

Where to put API Key in Google Cloud Vision for PHP