Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否有任何方法可以将JSX或类似工具用于主干网?_Javascript_Backbone.js_Reactjs_React Jsx - Fatal编程技术网

Javascript 是否有任何方法可以将JSX或类似工具用于主干网?

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

关于React,我喜欢的一件事是将模板和视图代码放在同一个文件中(没有字符串连接)。有没有办法在主干网中做类似的事情?因此:

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>
    `);
  }
});