Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.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 如何在Yii2资产包中使用JSX文件_Javascript_Reactjs_Yii2_React Jsx_Assetbundle - Fatal编程技术网

Javascript 如何在Yii2资产包中使用JSX文件

Javascript 如何在Yii2资产包中使用JSX文件,javascript,reactjs,yii2,react-jsx,assetbundle,Javascript,Reactjs,Yii2,React Jsx,Assetbundle,我已经有了Yii2项目设置,我决定使用Facebook的JavaScript框架,它提供了一种在JavaScript代码中声明HTML模板的便捷方法,名为 我的JavaScript如下所示: (function () { 'use strict'; MyBlock = React.createClass({ getInitialState: function () { return {data: []}; },

我已经有了Yii2项目设置,我决定使用Facebook的JavaScript框架,它提供了一种在JavaScript代码中声明HTML模板的便捷方法,名为

我的JavaScript如下所示:

(function () {
    'use strict';

    MyBlock = React.createClass({
        getInitialState: function () {
            return {data: []};
        },
        componentDidMount: function () {
            $.ajax({
                url: '/api/',
                dataType: 'json',

                success: function (data) {
                    this.setState({ data: data });
                }.bind(this)
            });
        },

        render: function () {
            <div class="block">
                {this.props.variable}
            </div>
        }
    });

    React.render(
        <ProfileQuestion />,
        document.getElementById('profile_question_wrapper')
    );
}());
但是,当它在我的页面底部添加脚本时,它显示为

<script src="/js/app.jsx"></script>

有没有办法在AssetBundle中指定.jsx文件在呈现时脚本元素中的类型应为
text/jsx
可以将属性传递给js文件的脚本标记。但是,它将传递给JS数组中的所有文件,因此您需要有两个资产类。像这样

class MyAsset extends AssetBundle
{
    public $basePath = '@webroot';
    public $baseUrl = '@web';
    public $css = [
    ];
    public $js = [
        '//fb.me/react-0.13.1.min.js',
        '//fb.me/JSXTransformer-0.13.1.js',
    ];
    public $depends = [
        'app\assets\AppAsset'
    ];
}
二等舱

class JSXAsset extends AssetBundle
{
    public $basePath = '@webroot';
    public $baseUrl = '@web';

    public $js = [
        'js/app.jsx',
    ];
    public jsOptions = ['type'=>'text/jsx'];
    public $depends = [
        'app\assets\MyAsset'
    ];
}

并在您的视图中包含第二个类。jsOptions调用函数,该函数在Html类中依次调用jsFile helper函数。如果没有特别定义,选项将作为脚本标记属性传递

注意JSXTransformer不用于生产;它又大又慢。此外,在开发中,您应该使用开发版本(not.min),因为在生产中会出现一些有用的警告和错误。请注意!谢谢,我已经在我的资产包中更改了react-to-development版本。在单个视图中有两个资产看起来有点奇怪,在单个jsx文件中有一个单独的资产包更是如此。但它解决了我的问题。如果没有其他更合适的解决方案,我很赞成。谢谢!您只能包括第二个资产,因为这取决于第一个类别,它也将自动包括在内。至于多个类,直到Yii core在每个文件级别添加了对jsOptions的支持,我们无能为力。是的,我只添加了JSX资产,我想在资产文件夹中为单个视图添加两个类,这让我感到有点沮丧。但事实上,我们对Yii框架的特性无能为力。JSX不应该在服务器上而不是客户端上编译吗?
class MyAsset extends AssetBundle
{
    public $basePath = '@webroot';
    public $baseUrl = '@web';
    public $css = [
    ];
    public $js = [
        '//fb.me/react-0.13.1.min.js',
        '//fb.me/JSXTransformer-0.13.1.js',
    ];
    public $depends = [
        'app\assets\AppAsset'
    ];
}
class JSXAsset extends AssetBundle
{
    public $basePath = '@webroot';
    public $baseUrl = '@web';

    public $js = [
        'js/app.jsx',
    ];
    public jsOptions = ['type'=>'text/jsx'];
    public $depends = [
        'app\assets\MyAsset'
    ];
}