我有一个像这样的 json 对象:
let data = {
UI: {
"baseType":"App",
"children":[
{
"baseType":"TextField",
"props":{
}
}
]
}
};
我想把它渲染成:
<App>
<TextField>
</TextField>
所以,我需要从 json 对象中获取动态渲染的组件。同样,我写了一个方法:
getFromJson(obj) {
// let Type = obj.baseType;
let children = obj.children
? obj.children.map((obj) => {
return this.getFromJson(obj,obj.baseType);
})
: '';
// <></
switch (obj.baseType) {
case "App":
return (
<App key={key} {...obj.props}>
{children}
</App>
);
case "TextField":
// {children}
// </TextField>);
return (<TextField key={key} {...obj.props}>
{children}
</TextField>
);
default:
return <h1>Returning default case.</h1>;
}
// return <div>Hello</div>
}
我正在调用上面的方法:
render() {
let renderedUI = "";
if (this.props.json.UI) {
renderedUI = this.getFromJson(this.props.json.UI, "UI");
}
return renderedUI;
}
输出只是 App 组件,也就是说,子组件不会被渲染。 children 虽然有值(value):{$$typeof: Symbol(react.element), key: "TextField", ref: null, props: {…}, type: ƒ, …}
.
我做错了什么?
编辑:我的整个组件是:
import React from "react";
import TextField from "./TextField";
import App from "./App";
export default class RenderFromJson extends React.Component {
constructor() {
super();
this.getFromJson = this.getFromJson.bind(this);
}
componentWillMount() {}
getFromJson(obj,key) {
// let Type = obj.baseType;
let children = obj.children
? obj.children.map((obj) => {
return this.getFromJson(obj,obj.baseType);
})
: '';
// <></
switch (obj.baseType) {
case "App":
return (
<App key={key} {...obj.props}>
{children}
</App>
);
case "TextField":
// {children}
// </TextField>);
return (<TextField key={key} {...obj.props}>
{children}
</TextField>
);
default:
return <h1>Returning default case.</h1>;
}
// return <div>Hello</div>
}
render() {
let renderedUI = "";
if (this.props.json.UI) {
renderedUI = this.getFromJson(this.props.json.UI, "UI");
}
return renderedUI;
}
}
文本字段:
import React from "react";
export default class TextField extends React.Component {
constructor() {
super();
}
render() {
console.log("returning from textfield");
return <h1>Hi from textfield</h1>;
}
}
App.js
import React from "react";
import axios from "axios";
import RenderFromJson from "./RenderFromJson";
export default class App extends React.Component {
constructor() {
super();
}
componentWillMount() {}
render() {
return <h2>In App</h2>;
}
}
最佳答案
终于在一小时后我发现了问题,你的 App
组件将在 props
对象中获取 children
数组,你必须将 child 附加到里面你的 App
组件
export default class App extends React.Component {
constructor() {
super();
}
render() {
return <div>
<h1>In App</h1>
{this.props.children /* this what solve the issue */}
</div>
}
}
关于javascript - 从 json 数据动态渲染 React 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48402815/