React中如何實現雙向數據綁定?

React是單向數據流的,那能不能實現雙向數據綁定呢?能實現的話怎麼實現?


不建議

如果堅持,請看Two-Way Binding Helpers


import React, {Component} from "react"

class Hello extends Component {
constructor(props) {
super(props)
this.state = {
value: ""
}
}

handleInput = _event =&> {
let event = _event
let elem = event.target
let value = elem.value
if(elem.attributes.twoWay != null){
let attr = elem.attributes.twoWay.value
this.setState(state =&> state[attr] = value)
}
}

render() {
return (
&
&
&{this.state.value}& & )
}
}

export default Hello;

我們把state這個名字換一下:

import React, {Component} from "react"

class Hello extends Component {
constructor(props) {
super(props)
this.viewModel = {
value: ""
}
}

handleInput = _event =&> {
let event = _event
let elem = event.target
let value = elem.value
if(elem.attributes.twoWay != null){
let attr = elem.dataset.twoway.value
this.setViewModel(viewModel =&> viewModel[attr] = value)
}
}

render() {
return (
&
&
&{this.state.value}& & )
}
}

export default Hello;

而常見的MVVM是這麼實現的:

let vm = {
_data: "",
get data() {
return this._data
},
set data(value) {
this._data = value
notify() // 通知View層更新數據
}
}

MVVM雙向綁定工業界用了十年,現在跳出來一群人說雙向綁定不好,狀態容易亂,我們要單向數據流云云,然後大喊xx才雙向綁定

且不說這些人明白不明白MVVM的精髓,MVVM雙向綁定的重量級應用比這些人打過的嘴炮都多,到底誰才是xx?


簡單實現react雙向數據綁定 · Issue #3 · lhang/blog

在看Vue.js文檔中的想法,歡迎討論


http://reactjs.cn/react/docs/thinking-in-react.html

最後面的添加反向數據流


推薦閱讀:

為什麼說 DOM 綁定事件很耗性能?
在DOM里 屬性節點是不是元素節點的子節點?
fibjs 對比 nodejs 有哪些優點和缺點?
ECMAScript 6 會重蹈 ECMAScript 4 的覆轍嗎?
為何大多數人和新的項目不用 TypeScript 而用 JS + 一堆輔助工具?

TAG:前端開發 | JavaScript | React | Flux | ReactNative |