1

I am currently having an issue rendering a component using multiple ternary operators.

Here is my code:

{data.shippingData ? (
   <CheckoutPayment data={data} setData={setData} />
  ) : data && data.agree === true ? (
                console.log("Hello World")
              ) : (
                    <CheckoutShipping setData={setData} />
                  )}

The <CheckoutPayment /> and <CheckoutShipping /> components successfully rendered without issues, the issue lies in having to render another component using this condition data && data.agree === true. In the above code, I tried using console.log to log "Hello World" but to no avail.

Here is how the data model is structured in the <CheckoutPayment />:

{shippingData: {firstName, lastName, streetAddress, state, city, phoneNumber }, agree: true}

I took the data from the <CheckoutPayment /> component into the global state where I have to pass the data to another component.

The data is available in the state. In fact, I console.log the data to confirm if it was there in which it was.

What I have in mind to achieve is:

  1. If there is shippingData in data object I want to render <CheckoutPayment /> else if
  2. There is shippingData and agree in the data object I want to console.log("Hello World") else
  3. Render <CheckoutShipping />

My question is, is there a way I might have misused the ternary operator or I am not getting something right.

3 Answers 3

5

Why not put this in a function, and call that function from render()?

getComponentToRender() {
   if(shippingData) {
     return <CheckoutPayment data={data} setData={setData} />;
   } else if(!(data || data.agree)) {
      return <CheckoutShipping />;
   } else {
     console.log("Hello World");
   }
   return null;
}

Inside your render you can do the following:

render() {
  return(
   <>{this.getComponentToRender()}</>
 );
}
Sign up to request clarification or add additional context in comments.

6 Comments

bro, you forgot the return keyword on the second if
Thanks @nouvist. updated the same.
Yea the key here is to console log before returning null or whatever placeholder is actually supposed to render
Thanks for the response. I am using a functional component. Well, I have done this before using a functional component but still didn't work. I think the problem should be how I am getting the data. The structure of the data is in this format {shippingData: {…}, agree: true}
@OgeObubu I think if you can share the data object, or its model, it may help
|
1

It doesn't have anything to do with the ternary, just that console.log() returns undefined and won't render anything. I think child.render() is what ultimately runs, the child instance is normally an object not a function

You're trying to render the result of console.log()'s return (undefined) as a sibling node (which would both need to be wrapped in a parent or a fragment like <></>

You should remove the console.log from the render return, and just

  1. console.log before returning anything
  2. render null or whatever placeholder error should exist there, maybe just a text node Hello World

1 Comment

Probably I am not being clear enough. I replaced the component that ought to be there with console.log. The component doesn't even render despite having the data. I am writing a React Multiple Form Function
1

Thanks, guys for the contributions. I do not take it likely. I have been able to figure the code out.

I changed the movement of the code. I had to return console.log to the top of the code and it worked out fine.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.