我有一个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组件,即没有渲染子项。孩子虽然有价值:{$$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;
}
}
的TextField:
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>;
}
}
答案 0 :(得分:1)
GetFromJson = ({ children }) => {
return children.map(elem => {
const Tag = elem.baseType
const props = { elem }
return (
<Tag> ...props </Tag>
)
})
}
然后在你的组件中
render(){
return <GetFromJson children={this.props.json.UI.children} />
}
我只是想知道,你在道具中有什么?因为也许我们需要改变......道具
答案 1 :(得分:1)
最后一小时后我发现问题,您的App
组件会在children
对象中获得props
数组,并且您必须将这些子项附加到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>
}
}
答案 2 :(得分:0)
可能你有绑定问题,试试这个
constructor(props) {
super(props);
this.getFromJson = this.getFromJson.bind(this);
}