Javascript 是否有任何方法可以将JSX或类似工具用于主干网?
关于React,我喜欢的一件事是将模板和视图代码放在同一个文件中(没有字符串连接)。有没有办法在主干网中做类似的事情?因此:Javascript 是否有任何方法可以将JSX或类似工具用于主干网?,javascript,backbone.js,reactjs,react-jsx,Javascript,Backbone.js,Reactjs,React Jsx,关于React,我喜欢的一件事是将模板和视图代码放在同一个文件中(没有字符串连接)。有没有办法在主干网中做类似的事情?因此: var MyView = Backbone.View.extend({ render() { return ( <div>blah blah</div> ); } }); var MyView=Backbone.View.extend({ render(){ 返回( 废话 ); } }); React的JSX
var MyView = Backbone.View.extend({
render() {
return (
<div>blah blah</div>
);
}
});
var MyView=Backbone.View.extend({
render(){
返回(
废话
);
}
});
React的JSX transpiler用于要求使用pragma注释来指定包含名为函数的标记的对象,以便将JSX标记传输到函数调用。这使得您可以提供自己的后端并使用它来代替React.DOM
——一位核心开发人员以DOM后端为例:
从那时起,情况发生了一些变化-不再需要pragma注释,React的JSX transpiler假定您正在使用React和transpiles来调用React.createElement()。考虑到这一点,另一种选择是简单地复制React的JSX transpiling代码,并对其进行调整以输出其他内容——例如,我使用了,它允许您使用JSX
还有一个用于React的JSX transpiler的实现。巴贝尔也支持插件。如果你可以在任何地方使用JSX,并告诉巴贝尔你希望它通过插件传输到什么地方,这将是一个理想的选择,但上次我查看时,我没有找到一种简单的方法来重用巴贝尔的JSX transpiler的核心并调整输出
您还可以通过在render()
方法中使用常规DOM构建库,将模板保留在视图中。在我使用主干网时,曾经是我的最爱,但JSON-ML和函数调用风格中有几十个DOM构建库。使用Babel,您可以指定一个@jsx pragma,指向任何具有签名函数(类型,道具,…子函数){}
的函数
这里有一个最小的自包含示例(不要在生产中使用此示例,它不会逃避儿童)
有一些真正的库,但我不知道使用jsx进行哪种互操作
这是最直接的答案,但为什么不直接使用React with主干呢?主干中的视图系统是如此之小,以至于没有严肃的应用程序[需要引证]单独使用它。JSX的一点是,它被转换为树结构,因此可以用于创建DOM或虚拟DOM。如果您使用的是基于字符串的模板,那么您并不真正需要它。例如,您可以使用ES6字符串模板文本:
var MyView = Backbone.View.extend({
render() {
const name = this.model.get('name');
this.$el.html(`
<div class="hello">hello, ${name}!</div>
`);
}
});
var MyView=Backbone.View.extend({
render(){
const name=this.model.get('name');
这是$el.html(`
你好,${name}!
`);
}
});
值得注意的是,JSXDOM已经有一年零十个月没有被触动了。
// MyView.js
/** @jsx stringJsxThingy */
var MyView = Backbone.View.extend({
render() {
this.$el.html(
<div class="hello">hey</div>
);
}
});
/** @jsx stringJsxThingy */
"use strict";
var MyView = Backbone.View.extend({
render: function render() {
this.$el.html(stringJsxThingy(
"div",
{ "class": "hello" },
"hey"
));
}
});
var MyView = Backbone.View.extend({
render() {
const name = this.model.get('name');
this.$el.html(`
<div class="hello">hello, ${name}!</div>
`);
}
});