【发布时间】:2018-07-02 08:06:04
【问题描述】:
我有一个像这样的 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;
}
}
文本字段:
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>;
}
}
【问题讨论】:
-
谢谢。但是,那是一个巨大的图书馆。我正在寻找与我的场景相关的答案。
-
没那么大。考虑努力通过大量示例学习经过良好测试的实现,而不是尝试重新发明轮子。
-
你能发
TextField组件吗? -
@Ali 请看一下。
标签: javascript reactjs