javascript - 如何在reactjs中重建现有的Dom?

标签 javascript html xml dom reactjs

我目前正在尝试让reactJS使用以下设置:

我从服务器获取 xml-DOM。它是服务器端渲染的“自定义”DOM,通常由渲染组件的另一个客户端(不是 html,而是 java)使用。

<row id="a">
    <label id="aa" width="140" text="Title" />
    <field id="ab" bgpaint="" width="200" text="" enabled="true" />
</row>

我用 React.createClass() 定义了一些 ReactComponent。所以我有一个标签、一个字段和一个行 (div)。

目前我无法找到一种方法来使用 React 渲染 xml-DOM 的组件。 我将遍历 xml-DOM 并从上面获取片段。如果我找到一个“行”shell,我会调用 React.createElement(Row, {}, ?)?但我不知道什么 child 会来填补这个“?”在我深入研究 xml-DOM 之前。 如果我遍历 xml-DOM 直到得到一个没有子节点的“endNode”,我如何从下到上创建 react 元素?我是否必须创建一个 super 字符串并以某种方式将其称为 javascript。

有没有办法创建一行,然后添加子行?我必须使用组件 Prop 吗? 像这样的东西:

//<row> found
var newRow = React.createElement(Row, {}, ?);
...
//found the label in the row
var newLabel = React.createElement(Label, {}, "Title");
newRow.add(newLabel);

我很难找到解决方案 - 可以用 React 来做吗?或者我正在尝试做一些不适合 react 的事情?可能我不完全理解 child 的概念。 或者也许它本身并不是一个真正的 react 问题......

有什么提示给我吗?

打招呼

最佳答案

在调用 createElement 之前创建子数组。例如(jsfiddle):

function pascalize(str) {
    return str.split("-").map(function(name) {
        return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();
    }).join("");
}

function attrsToProps(attrs) {
    var obj = {};
    for (var i = 0; i < attrs.length; ++i) {
        obj[attrs[i].nodeName] = attrs[i].value;
    }
    return obj;
}

function toReact(node, components) {
    if (node.nodeType === 1) {
        var children = [].map.call(node.childNodes, function(child) {
            return toReact(child, components);
        });
        return React.createElement(components[pascalize(node.nodeName)],
                                    attrsToProps(node.attributes),
                                    children);
    } else if (node.nodeType === 3) {
        return (node.nodeValue + "").trim();
    }
    return "";
}

function xmlToReactComponents(xmlDom, components) {
    if (xmlDom && xmlDom.documentElement) {
        return React.createElement("div", [], [].map.call(xmlDom.documentElement.childNodes, function(child) {
            return toReact(child, components);
        }));
    }
}

jsfiddle中的用法是:

var xml = document.querySelector("#xml").innerHTML;
var parser = new DOMParser();
var dom = parser.parseFromString(xml, "text/xml");

var defaultClass = {
    render: function() {
        return React.createElement("div", {}, "id: " + this.props.id, this.props.children);
    }  
};

var components = {
    Row: React.createClass(defaultClass),
    Label: React.createClass(defaultClass),
    Field: React.createClass(defaultClass)
}
var result = xmlToReactComponents(dom, components);
React.render(result, document.body);

您需要传递 xml 可以在对象中创建的所有组件,否则整个过程都会失败

关于javascript - 如何在reactjs中重建现有的Dom?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27529568/

相关文章:

xml - 如何计算 flex 中的根 xml 标记中有多少个子节点?

javascript - 页面重新加载验证后,下拉列表未加载

javascript - PWA 应用的自动更新解决方案

javascript - .queue() 和 jquery.queue() 之间的区别

.net - 查找任意数量的子节点具有特定属性的子节点?

c# - XmlIgnore 不起作用

javascript - jQuery AJAX PUT 具有空的 QUERY_STRING 和 REQUEST PHP 变量

javascript - 在 Javascript 中使用 JQuery Mobile 添加项目到列表

java - 从网站打开 Android 应用程序不起作用

html - 如何使链接可点击但又不可点击?