2017-07-17 4 views
1

Express経由でReactコンポーネントツリーを送信しようとしていますが、コンポーネントの配列には重要な$$typeof: Symbol.for('react.element')プロパティが含まれています。私はres.sendを使用しています。オブジェクトの残りの部分は、そのプロパティを除き通過します。私はSymbolとは関係があるかもしれないとアドバイスされています。 JSON.stringifyもプロパティを削除します。Symbolicプロパティを持つJavaScriptオブジェクトがStringifyによって削除されました

私はこの問題をSymbolの値を持つプロパティに絞り込みました。これはin the documentation for stringify.に反映されます。なぜそれが事実か回避策が何であるか説明することはできますか?シンボルが値として使用されているので

const obj1 = { 
 
    'stringKey': Symbol.for('String Value'), 
 
    boolKey: true, 
 
    numKey: 1 
 
} 
 

 
const obj2 = {...obj1, 'stringKey': 'Plain String'} 
 

 
console.log(JSON.stringify(obj1)) 
 
console.log(JSON.stringify(obj2))

+0

うーん、コンポーネントのツリー全体をマーシャリングすることは、私が前に見てきたものではありません。ほとんどの場合、前記ツリーを決定する状態または他のオブジェクトは、ワイヤを介して直列化されるものである。アーキテクチャに関しては、これは厳しい要件ですか? – enjoylife

+0

私は行くように私はそれを作っています。私はこのツールを試していますhttps://github.com/cerebral/marksyと私は、サーバー上のマークダウンファイルを解析しているし、クライアントに解析されたコンテンツを送信し、そこからレンダリングしています。 – motleydev

+0

ああ、サーバー側のレンダリングをお探しですか?その場合、 'renderToString'の出力を使用する必要があります。ドキュメントを参照してください。また、reduxを使用していない場合でも、このチュートリアルには良い情報があります。http://redux.js.org/docs/recipes/ServerRendering.html – enjoylife

答えて

0

あなたはreviver

const obj1 = { 
 
    'stringKey': Symbol.for('String Value'), 
 
    boolKey: true, 
 
    numKey: 1 
 
} 
 

 
const obj2 = {...obj1, 'stringKey': 'Plain String'} 
 

 
console.log(JSON.stringify(obj1, (name, value) => { 
 
    if(typeof value === 'symbol') { 
 
     value = `$$${Symbol.keyFor(value)}` 
 
    } 
 
    return value 
 
})) 
 
console.log(JSON.stringify(obj2))

カスタム使用して、カスタムあなたが受信側で復元することができ、文字列に記号をフォーマット replacerを使用することができます

Naive de mo。レジストリからシンボルとして復元する必要がある小道具を、よりうまく中に入れることができます。

const a = {a: Symbol.for('a')} 
 
const str = JSON.stringify(a, (k,v) => typeof v === 'symbol' ? `$$Symbol:${Symbol.keyFor(v)}` : v) 
 
const b = JSON.parse(str, (k,v) => { 
 
    const matches = v.match && v.match(/^\$\$Symbol:(.*)$/) 
 
    return matches ? Symbol.for(matches[1]) : v 
 
}) 
 

 
console.log(a, str, b, a.a === b.a)

関連する問題