2017-08-24 9 views
1

私は、反応型jsコンポーネントをhtmlファイル入力を通じて動的にロードしたいと考えています。基本的には、私が行ったのと同じ効果を達成したいと思います。import Foo from ./foo.js反応コンポーネントを入力と動的にロードしてレンダリングする[type = file]

html要素のonChangeイベントの後にファイルをテキストとして読み取ることはできますが、それで何をするのか分かりません。私の目標を達成することさえ可能ですか?ありがとう!

onChange(e) { 
    var fr = new FileReader() 

    fr.addEventListener('load', f => { 
    window.console.log(f.target.result.substring(0, 500)) 
    // yields: import React, { Component } from 'react' ... class Foo extends Component { ... 
    // but now what? 
    }) 

    fr.readAsText(e.target.files[0]) 
} 
+1

何らかの 'eval'を使用する必要があります。しかし、問題は、ブラウザに理解できないコンストラクタ( 'import'など)がファイルに含まれていることです。 –

+0

@FelixKling hhmmm ..私は輸入が物事を台無しにするとは考えていませんでした。これをステートレスな機能コンポーネントに限定しなければならない場合があります。 – Adam

+0

[babel-standalone](https://github.com/babel/babel-standalone)のように見えるかもしれません! – Adam

答えて

0

これで、babel-standaloneで動作するようになりました。しかし、私はステートレスで機能的なコンポーネントしか使用できません。私の実装を改善できるかのように感じます。たとえば、私はどのようにしてstring.prototype.replaceする必要があります好きではありません。

とにかく、私のために働いたことは、うまくいけば、それもあなたを助けるかもしれません。

// fileToBeLoaded.js 
const elem =() => <h1>Hello, world!</h1> 

// foo.js 
import React, { Component } from 'react' 
import { transform } from 'babel-standalone' 

class Foo extends Component { 
    constructor(props) { 
     super(props) 

     this.state = { 
      elem: undefined 
     } 

     this.handleChange = this.handleChange.bind(this) 
    } 

    handleChange(e) { 
     let fr = new FileReader() 

     fr.addEventListener('load', e1 => { 
      let s = e1.target.result 
      let result = transform(s, { 
       presets: ['es2015'], 
       plugins: ['transform-react-jsx'] 
      }) 

      let s1 = result.replace(`'use strict'; 

      let elem = function elem(props) {`, 'elem = function(props) {') 

      let elem =() => {} 
      elem = eval(s1) 

      this.setState({elem}) 
     }) 

     fr.readAsText(e.target.files[0]) 
    } 

    render() { 
     const Elem = this.state.elem ? this.state.elem :() => <h1>No elem!</h1> 
     return (
      <div> 
       <input type="file" onChange={this.handleChange} 
       <Elem /> 
      </div> 
     ) 
    } 
} 
関連する問題