gpt4 book ai didi

javascript - Backbone 和 React 单页应用程序的结构

转载 作者:可可西里 更新时间:2023-11-01 01:34:47 25 4
gpt4 key购买 nike

到目前为止,我一直在为我的大多数前端 JavaScript 项目使用 backbone.js,但在听说 Facebook 的 react.js 后,我产生了兴趣并开始四处探索.

我想知道我是否应该再使用 Backbone.View 类,或者用 react “组件”替换每个“ View ”——甚至是“基本 View ”页面布局 ...

我在互联网上发现了一些仍然使用 Backbone.View 的帖子——我偶然发现的其他帖子只创建了 React 类。

也许有人能给我指明正确的方向……在单页应用程序中使用什么以及如何最好地实现多个“页面/状态”,而不仅仅是通常的(我再也受不了了)TODO 示例。

这里是我想出的一些代码:

主干初始化内容:

require(
[
"jsx!app/view/base",
"react",
"app/router",
"backbone"
],
function (BaseView, React, Router, Backbone) {
"use strict";

var router = new Router();
var base = new BaseView({router: router});

React.renderComponent(base, document.getElementById("page"));

router.on("route", function(action) {
base.setProps({path: action});
});

Backbone.history.start({pushState: true});
}
);

应用程序/路由器:

define(function(require) {

"use strict";

var Backbone = require("backbone");

/**
*
*/
var Router = Backbone.Router.extend({
routes: {
"": "home",
"test": "test",
"*error": "404"
}
}); // end Router


return Router;
});

app/view/base.jsx:

define(function(require) {

"use strict";

var React = require("react");

var mixins = require("app/utils/mixins");

var Header = require("jsx!app/view/header");
var ContentHome = require("jsx!app/view/content_home");
var ContentTest = require("jsx!app/view/content_test");
var ContentLogin = require("jsx!app/view/content_login");

/**
*
*/
var BaseView = React.createClass({

render: function() {
var content;

switch (this.props.path) {
case "home":
content = <ContentHome />
break;
case "test":
content = <ContentTest />
break;
case "login":
content = <ContentLogin />
break;

case "404":
default:
content = "Error, page not found";
break;
}

return (
<div id="base" onClick={this.onClick}>
<Header />
{content}
</div>
);
},

onClick: function(event) {
if (event.target.tagName.toLowerCase() === "a" &&
event.target.className === "main") {
event.preventDefault();
this.props.router.navigate(event.target.pathname, {trigger: true});
}
}

}); // end BaseView

return BaseView;
});

但我对这个设置并不完全满意。欢迎任何意见。

最佳答案

不要像您一样持有对组件的引用。如果需要use refs或者更好的是,只需在回调中渲染组件。 React 将检查它是否需要更新 DOM。

require(
[
"jsx!app/view/base",
"react",
"backbone"
],
function (BaseView, React, Backbone) {
"use strict";

var router = Backbone.Router.extend({
routes: {
"": "home",
"test": "test",
"login": "login",
"*error": "404"
}
}).on('route', function(action) {
React.renderComponent(
<BaseView router={router} path={action} />,
document.getElementById("page")
);
});

Backbone.history.start({pushState: true});
}
);

编辑:由于 BaseView 中的逻辑与 Router 中的逻辑非常相关,因此将它们保存在同一个文件中最有意义。

var BaseView = React.createClass({
render: function() {
return (
<div id="base" onClick={this.onClick}>
<Header />
{this.props.children}
</div>
);
},

onClick: function(event) {
if (event.target.tagName.toLowerCase() !== "a") return;
if (event.target.className !== "main") return;

event.preventDefault();
this.props.router.navigate(event.target.pathname, {trigger: true});
}
});

应用程序/路由器:

var router = Backbone.Router.extend({
routes: {
"": "home",
"test": "test",
"login": "login",
"*error": "404"
}
}).on('route', function(action) {
var pathMapping = {
"home": ContentHome,
"test": ContentTest,
"login": ContentLogin
};
var Content = pathMapping[action] || Content404;

React.renderComponent(
<BaseView router={router}>
<Content />
</BaseView>,
document.getElementById("page")
);
});

Backbone.history.start({pushState: true});

关于javascript - Backbone 和 React 单页应用程序的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22053052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com