这是一个基本代码笔的链接,它将<input>
标签与 Gun 实例同步,并将 Gun 更新连接到 React setState。
https://codepen.io/anon/pen/weJxNO?editors=0011
我的期望:
当您在多个窗口中打开程序时,您可以在一个窗口中键入并在其他窗口中查看更新。在一个窗口中输入会改变 Gun store,然后导致所有实例传播事件,从而跨窗口重新渲染所有 React 组件。
实际发生的情况:
如果您在多个窗口中打开程序,请注意在一个窗口中键入会更改所有窗口的 localStorage 值。然而,只有您实际输入的窗口才会记录来自 Gun 商店的事件。
可能的解决方案:
我知道我可以在所有客户都与之通信的服务器上设置一个 Gun 实例。但这不是与 Gun 的目的背道而驰吗?p2p 系统的优点是您不需要中央权威来源。
问题重述:
我如何连接程序以使所有 Gun 实例触发更改事件,从而在没有中央服务器的情况下跨窗口更新每个 React 组件?
来自 Codepen 的相关代码:
class App extends React.Component {
constructor() {
super()
this.state = {name: ''};
this.gun = Gun()
}
componentDidMount() {
this.gun.get('user').on(
({ name }) =>
this.setState({ name }))
}
render() {
return <div>
<h1>Hey, {this.state.name || '(your name here)'}</h1>
<input
value={this.state.name}
placeholder="edit your name here"
onChange={({ target }) =>
this.gun.get('user')
.put({ name: target.value })}
/>
<p>you should see updates in multiple browser windows</p>
<p>you can see your localStorgae update every time you type in other windows</p>
<p>but the state is only set when you type in this window</p>
</div>
}
}