We are using spread operator to spread the object {name: “some text”} or an empty object {} based on the value of our flag hasName. To check the condition we are using ternary operator. So the component have name prop or no prop named name
What is optional chaining? Optional chaining allows you to access the value of a property in a nested object without the need to validate each object key/value in the chain.
I will try to explain it with an example.
I have an object, the value I have is deep inside a nested object.
I want to check the value of dataExpiryDays and do something.
We can do this like this
if(data.user.feed.edgeReels.tray.node.dataExpiryDays) {
// do something
}
Wait…. anyone using JavaScript might know the potential dangers of this approach. If any of the nested object is not available or null the above line of code will break.
Example if the key edgeReels is not available, you will get an error like Cannot access tray of undefined .
So we write the above code like this.
if (
data &&
data.user &&
data.user.feed &&
data.user.feed.edgeReels &&
data.user.feed.edgeReels.tray &&
data.user.feed.edgeReels.tray.node &&
data.user.feed.edgeReels.tray.node.dataExpiryDays
) {
// do something
}
See you need to do a check for every keys in each nested level.
To avoid these kind of checks, there was new feature proposal called Optional Chaining to be included in ES7. The proposal is now in Stage 4 (5/31/2020 – when I was writing this.) . See the proposal here.
The Optional Chaining operator ?.
With optional chaining operator we can write the above if condition like this.
if(data?.user?.feed?.edgeReels?.tray?.node?.dataExpiryDays) {
// do something
}
If any of the keys are missing subsequent checks are not done and the if condition fails.
Question 1: Can we validate an array position using Optional chaining?
Yes. like this
if(data?.nameArray?.[0]) {
// nameArray has index 0
}
Now the big questions.
Can we use Optional chaining in my JavaScript project?
Can we use Optional chaining in my React App?
Can we use Optional chaining in my JavaScript project?
No. As Optional chaining is still in proposal stage, most browsers will NOT have full support implemented. So I recommend not to use it unless you add polyfills. As of 8/8/2022 all latest browser versions support optional chaining. The latest browser support can be viewed here in CanIUse website.
Can we use Optional chaining in my React App?
React CRA uses Babel. Babel is a JavaScript transcompiler which makes new/next generation JavaScript features backward compatible with all browsers(don’t expect IE older versions).
So if you use React or Gastby or any other JavaScript project uses Babel 7.8 or above versions you are good to use Optional Chaining. If you are using React CRA check Babel version inside node-modules/@babel/core/package.json or check for a folder plugin-proposal-optional-chaining inside node-modules/@babel/
Use below to move Recharts legend to top of the graph. In fact you can position the legends any where (top, right, bottom , left, left top, left middle etc) you like. I have added few code samples for that corresponding images. Please go through it.
Scenario: I am using the new React Table 7x (the headless component). By default there will be a column header for the entire table columns. You can give empty string so that the Header will not be shown. By the problem is that row in html will be still rendered (see the below image). So I want to hide the entire row in html. I am using Material Table with react-table to render the table.
Row with empty contents
Solution
Add a custom key hideHeader:Β false, in the columns variable.
Create a label around the input which we created in step 1 Add Material UI Button or Fab based on how you want your file upload to look.
Lets try with Button first.
File upload button
Inside the label which we created add a Button component. Add the props component with value span. This is very important otherwise the button component will render using the html <button> tag, which fails our file upload.
For Button component the code will look like this. (working example at the end of post)