javascript - React 树 - 如何删除当前节点?

标签 javascript reactjs

我正在做一个关于 React 的教程,其中创建了一棵树。 例如,这个变量被表示为一棵树:

var tree = {
    title: "howdy",
    childNodes: [
        {title: "bobby"},
        {title: "suzie", childNodes: [
            {title: "puppy", childNodes: [
                {title: "dog house"}
            ]},
            {title: "cherry tree"}
        ]}
    ]
};

我想在每个节点旁边添加一个按钮,用于删除当前节点及其子节点。

var TreeNode = React.createClass({
    getInitialState: function() {
        return {
            visible: true
        };
    },
    handleDeleteClick: function() {
        //What should I place here?
    },
    render: function() {
        console.log(this.state);
        var childNodes;
        var classObj;

        if (this.props.node.childNodes != null) {
            childNodes = this.props.node.childNodes.map(function(node, index) {
                return <li key={index}><TreeNode node={node} /></li>
            });

            classObj = {
                togglable: true,
                "togglable-down": this.state.visible,
                "togglable-up": !this.state.visible
            };
        }

        var style;
        if (!this.state.visible) {
            style = {display: "none"};
        }

        return (
            <div>
                <h5 onClick={this.toggle} className={React.addons.classSet(classObj)}>
                    {this.props.node.title}

                    <span className="input-group-btn">
                        <button className="btn btn-default" onClick={this.handleDeleteClick}>
                            Delete
                        </button>
                    </span>
                </h5>

                <ul style={style}>
                    {childNodes}
                </ul>
            </div>
        );
    },
    toggle: function() {
        this.setState({visible: !this.state.visible});
    }
});

我该怎么做? 不幸的是,目前我无法在后端使用数据库。(我可以在没有数据库的情况下维护状态吗?)

最佳答案

您可能不希望将树内容保存在全局变量中,而是保存在组件的状态中。您已将组件的状态用于 visible 变量,因此请尝试以类似方式添加 tree 变量。

要在页面重新加载时保留状态,您可以(目前)使用类似 localStorage 的内容。您可以在每次更改后保存树对象(您必须序列化它,例如使用 JSON.stringify),并在加载页面时从中加载它(这次使用 反序列化) JSON.parse)。

由于您已经很好地抽象了 TreeNode 组件,因此您可能应该创建一个新组件(例如 Tree)来执行以下操作:存储树、处理添加/删除节点、处理存储。 Tree 组件有一个根 TreeNode,它传递 this.state.tree 内容。

var Tree = React.createClass({
    getInitialState: function() {
        return {
            tree: // ...
        };
    },
    handleDeleteClick: function(node) {
        // do some logic here to remove `node` from whereever it occurs
        // make sure to COPY this.state.tree and modify that, not modify the
        // original object, then pass it to this.setState()
    },
    render: function() {
        return <TreeNode tree={this.state.tree} handleDeleteClick={this.handleDeleteClick} />;
    }
});

handleDeleteClick 传递到每个树节点,单击按钮时,您应该调用向下传递的回调(this.props.handleDeleteClick)并传入节点本身或某些节点第一个参数中的标识符(请参阅上面的定义)。

关于javascript - React 树 - 如何删除当前节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32779720/

相关文章:

javascript - 使用选定的表格行预填充选择下拉列表

javascript - 将方形或圆形图像放入谷歌地图中的直线路径中

javascript - 为什么 jQuery.inArray 不适用于对象数组

javascript - 如何使用 map 将 parent 的 Prop 传递给 child

reactjs - 如何在 react 中渲染矩阵中的元素?

reactjs - SSR React 与 redux 存储的数据

javascript - 如何在 Redux api 调用期间在组件上设置加载 bool 值

javascript - 确保 MongoDB 中的点赞索引

javascript - 我无法将我的 Vuejs 应用连接到 Firebase

reactjs - Twitter 卡片元标记在 index.html 中工作,而不是在 React Helmet 中