2017-06-13 51 views
2

我需要在我的视图(html文件)中呈现React组件。我正在使用webpack 1并且得到了component undefined的错误。我试图使用window.component,但它没有工作。如果我在组件内部使用RenderDOM,则一切正常。在html脚本标记中未定义React组件

我的组件:

export class SmallCart extends BaseComponent { 
    ... 
    render() {...} 
} 

的WebPack 1配置:

var ExtractTextPlugin = require("extract-text-webpack-plugin"); 
var BowerWebpackPlugin = require('bower-webpack-plugin'); 
var CopyWebpackPlugin = require('copy-webpack-plugin'); 
var webpack = require('webpack'); 

module.exports = { 
    devtool: 'source-map', 
    entry: { 
     ... 
     myComponent: "./wwwroot/js/es6/SmallCart/SmallCart.jsx", 
     ... 
    }, 

    output: { 
     path: __dirname + "/dist", 
     filename: '[name].js', 
     chunkFilename: '[id].chunk.js' 
    }, 
    module: { 
     loaders: [ 
      { 
       test: /\.(png|jpg|gif|ico)$/, 
       loader: "file-loader?name=assets/[name]-[hash:6].[ext]" 
      }, { 
       test: /\.woff(2)?(\?v=[0-9]\.[0-9]\.[0-9])?$/, 
       loader: "url-loader?limit=10000&minetype=application/font-woff&name=assets/[name]-[hash:6" + 
         "].[ext]" 
      }, { 
       test: /\.(ttf|eot|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/, 
       loader: "file-loader?name=assets/[name]-[hash:6].[ext]" 
      }, { 
       test: /\.scss$/i, 
       loader: ExtractTextPlugin.extract(['css-loader?-autoprefixer!postcss-loader', 'sass']) 
      }, { 
       test: /\.css$/i, 
       loader: ExtractTextPlugin.extract(['css-loader?-autoprefixer!postcss-loader']) 
      }, { 
       test: /\.(js|jsx)$/, 
       exclude: /(node_modules|bower_components)/, 
       loader: 'babel-loader', 
       query: { 
        presets: ['es2015', 'react'] 
       } 
      } 
     ] 
    }, 
    progress: true, 
    resolve: { 
     modulesDirectories: ['node_modules'], 
     extensions: ['', '.json', '.js'] 
    }, 

    externals: { 
     jquery: "jQuery", 
     react: "React", 
     reactDOM: "ReactDOM" 
    }, 

    plugins: [ 
     new webpack.ProvidePlugin({'window.Nette': 'nette-forms', 'window.jQuery': 'jquery', jQuery: 'jquery', $: 'jquery'}), 

     new webpack 
      .optimize 
      .CommonsChunkPlugin({ 
       filename: "commons.js", name: "commons", 

      }), 

     new ExtractTextPlugin("frontend.css"),    
    ] 
} 

在我看来,我有这样的:

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/react/15.5.4/react.js" charset="utf-8"></script> 
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/react/15.5.4/react-dom.min.js" charset="utf-8"></script> 
     <script type="text/javascript" src="/dist/commons.js" charset="utf-8"></script> 
    <script type="text/javascript" src="/dist/SmallCart.js" charset="utf-8"></script> 
<script type="text/javascript"> 
    window.data_for_react = {};   
    ReactDOM.render(React.createElement(SmallCart, { dataSource : data_for_react}, document.getElementById('box-to-rendering'))); 
</script>    

但是在渲染方法中,组件是未定义的。 有什么不对?是否有可能呈现组件?

谢谢您的时间。

编辑

好了,现在我尝试用window.SmallBasket和配置的WebPack更新:

... 
new webpack 
     .optimize 
     .CommonsChunkPlugin({ 
      names: [ 
       "commons" 
      ], 
      minChunks: Infinity 
     }), 
    ... 

和它的作品。但是如果没有窗户属性,我仍然无法解决它。

回答

1

尝试把所有从您的视图反应的代码是这样的:

document.addEventListener('DOMContentLoaded',() => { 

//... your ReactDOM.render stuff here 

}; 

你需要等待DOM元素之前,你可以的getElementById加载。

+0

谢谢你的评论。我试过了,但仍然得到'Uncaught ReferenceError:SmallCart is not defined' –

+0

尝试使用加载它? – OneNeptune

+0

使用JSX和babel语法?或者你是什么意思? –