2017-07-17 28 views
1

我试图通过express发送一个React组件树,并且我的组件数组包含关键$$typeof: Symbol.for('react.element')属性。我正在使用res.send。该对象的其余部分来自该属性除外。我被告知它可能与Symbol.for不可枚举有关? JSON.stringify也剥夺财产。带有Symbol属性get的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该格式符号你可以在接收端恢复的字符串

朴素的莫。你可以更好地列出应该作为注册表符号恢复的道具。

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)