I’m trying to build a React app. I have a dropdown menu component where each item is a combination of an array. Here is my code:
class PlotCardMenu extends React.Component {
renderMenuItems(m) {
let indices = Array(m)
.fill(0)
.map((v, i) => i);
let it = new Combination(indices, 3);
let menuItems = [];
for (let i = 0; i < it.length; i++) {
let item = "[" + it
.nth(i)
.map((e) => "f<sub>" + e + "</sub>")
.join(",") + "]";
console.log(item); // for sanity check
menuItems.push(<CDropdownItem key={i}>{item}</CDropdownItem>);
}
return menuItems;
}
render() {
return <CDropdownMenu>{this.renderMenuItems(4)}</CDropdownMenu>;
}
}
Now if I look at the component, I’m not getting the html rendered. What I want each item to look like this: [f_0, f_1, f_2]
, where f_0
means f-subscript-0
etc.
So I did some googling and found that I need to convert the string into html object. So I tried like this:
renderMenuItems(m) {
let indices = Array(m)
.fill(0)
.map((v, i) => i);
let it = new Combination(indices, 3);
let menuItems = [];
let parser = new DOMParser();
for (let i = 0; i < it.length; i++) {
let item = "[" + it
.nth(i)
.map((e) => "f<sub>" + e + "</sub>")
.join(",") + "]";
console.log(item);
let doc = parser.parseFromString(item, "text/html");
menuItems.push(<CDropdownItem key={i}>{doc}</CDropdownItem>);
}
return menuItems;
}
and I’m getting this error:
Uncaught Error: Objects are not valid as a React child (found: [object HTMLDocument]). If you meant to render a collection of children, use an array instead.
How do I solve it?
Note: CDropdownItem
and CDropdownMenu
are from coreui-react and Combination
is from js-combinatorics
.
Advertisement
Answer
Actually you are sending an array of string that’s why it render array as a string so don’t try to convert string to HTML Object. You have to send Array in place of string:
class PlotCardMenu extends React.Component {
renderMenuItems(m) {
let indices = Array(m)
.fill(0)
.map((v, i) => i);
let it = new Combination(indices, 3);
let menuItems = [];
for (let i = 0; i < it.length; i++) {
let item = it
.nth(i)
.map((e) => (<span>f<sub>{e}</sub></span>))
console.log(item); // for sanity check
menuItems.push(<CDropdownItem key={i}>{item}</CDropdownItem>);
}
return menuItems;
}
render() {
return <CDropdownMenu>{this.renderMenuItems(4)}</CDropdownMenu>;
}
}
I think it will resolve your problem.