2016-09-30 4 views
2

私はデータベースからデータを読み込み、反応を介してDOMにレンダリングしようとしています。入力には、draft.jsを使用してdbに保存する前にconvertToRawを実行しました。しかし、convertFromRawを実行してレンダリングすると、コンソールに次のエラーが表示されます。 "Uncaught TypeError:未定義の 'ブロック'プロパティを読み取れません。 draft.jsを初めて使用しているので、間違っていることがわかりません。誰かが助けてくれますか?どうもありがとうございます!DraftJS Uncaught TypeError:未定義の 'blocks'プロパティを読み取ることができません

//App.js 
 

 

 
import React, { 
 
    Component 
 
} 
 
from 'react'; 
 
import Blogs from './blogs'; 
 
import { 
 
    Editor, EditorState, convertToRaw 
 
} 
 
from 'draft-js' 
 
    // include horizon client 
 
const Horizon = require('@horizon/client'); 
 
const horizon = Horizon({ 
 
    secure: false 
 
}); 
 
// init blogs collection in rethinkdb 
 
const blogger = horizon('blogs') 
 

 
class App extends Component { 
 
    constructor(props) { 
 
    super(props); 
 
    this.state = { 
 
     title: false, 
 
     author: false, 
 
     editorState: EditorState.createEmpty() 
 
    } 
 
    } 
 

 
    // watch form values for change 
 
    handleChangeTitle(event) { 
 
    this.setState({ 
 
     title: event.target.value 
 
    }); 
 
    } 
 
    handleChangeAuthor(event) { 
 
    this.setState({ 
 
     author: event.target.value 
 
    }); 
 
    } 
 
    handleChangeBody(editorState) { 
 
    this.setState({ 
 
     editorState 
 
    }); 
 
    } 
 

 
    writeBlog() { 
 
    // check for empty string and return error to user 
 
    if (this.state.title === false || this.state.author === false || this.state.body === false) { 
 
     alert('Invalid Submission: One or more fields are empty'); 
 
     return; 
 
    } 
 
    let blog = { 
 
     title: this.state.title, 
 
     author: this.state.author, 
 
     editorState: convertToRaw(this.state.editorState.getCurrentContent()) 
 
    }; 
 
    // store the inputs in the database 
 
    blogger.store(blog); 
 
    } 
 

 
    render() { 
 
    return (<form> 
 
     < div className = "center" > 
 
     < Blogs blogger = { 
 
     blogger 
 
     } 
 
     /> 
 
        <div className="writer"> 
 
        <div className="basic-inputs"> 
 
         <div className="input-unit"> 
 
          <label>Title</label > 
 
     < input onChange = { 
 
     this.handleChangeTitle.bind(this) 
 
     } > < /input> 
 
         </div > 
 
     < div className = "input-unit" > 
 
     <label> Author < /label> 
 
          <input onChange={this.handleChangeAuthor.bind(this)}></input > 
 
     < /div> 
 
        </div > 
 
     <label> Blog < /label> 
 
        <Editor onChange={this.handleChangeBody.bind(this)} editorState={this.state.editorState}/> 
 
     < button onClick = { 
 
     this.writeBlog.bind(this) 
 
     } > Post < /button> 
 
        </div > 
 
     < /div> 
 
      </form > 
 
    ); 
 
    } 
 
} 
 

 
export 
 
default App;

import React, { Component } from 'react'; 
 
import {convertFromRaw} from 'draft-js' 
 

 
export default class Blog extends Component { 
 
    constructor(props) { 
 
     super(props) 
 
     this.props = props; 
 

 
    } 
 

 
    render() { 
 
     return (
 
      <div className="blog-container"> 
 
      <h2 className="title">{this.props.blg.title}</h2> 
 
      <h4 className="author">{this.props.blg.author}</h4> 
 
      <p className="body">{convertFromRaw(this.props.blg.body)}</p> 
 
      </div> 
 
     ); 
 
    } 
 
}

+0

? – finalfreq

+0

データベースからオブジェクトとしてdraftjs入力の状態を返します – ohenecoker

+0

'convertFromRaw(JSON.parse(this.props.blg.body))'を実行するとどうなりますか – finalfreq

答えて

0

Iは生にContentStateを変換するためにこれらの関数を使用して、その後、生オブジェクトからバックEditorStateにされています。

editorStateをrawに変換する際には、それをストリング化する必要があります。 ブログコンポーネントでそれを使用しようとすると、解析する必要があるかもしれません。

/** 
* @param { EditorState } editorState 
* @returns { object } 
*/ 
export const toRaw = editorState => { 
    return convertToRaw(editorState.getCurrentContent()); 
}; 

/** 
* @param { EditorState } editorState 
* @param { object } raw 
* @returns { EditorState } 
*/ 
export const fromRaw = (editorState, raw) => { 
    return EditorState.push(editorState, convertFromRaw(raw), 'update-state'); 
}; 

も、このようのlocalStorageからEditorStateを取得イム:

`this.props.blg.body`リターンを何
componentWillMount() { 
    if (!window.localStorage) { 
     return; 
    } 
    const _editorState = localStorage.getItem('editorState'); 
    if (_editorState) { 
     const parsedEditorState = JSON.parse(_editorState); 
     const editorState = EditorState.push(
     this.state.editorState, 
     convertFromRaw(parsedEditorState), 
     'update-state' 
    ); 
     this.setState({ editorState }); 
    } 
    } 
関連する問題