2017-05-18 259 views
1

我很困惑如何在我的代碼中使用@action。如何在Mobx + reactjs中使用@Action?

class Items { 

    @observable items= []; 

    @action addItem() { 
    let newItem= new Item(); 
    items.push(newItem); 
    } 
} 

@observer 
class ItemPage extends Component { 

    constructor() { 
    super(); 
    } 

    render() { 
    const {addItem} = this.props.store; 
    return (
     <div className="items"> 
     <input type="button" value="add" onClick={addItem}/> 
     </div> 
    ) 
    } 
} 

const store = new Items(); 

回答

1

請確保您改變this.items並不僅僅是items。您還需要無論是行動action.bound綁定或組件創建綁定處理程序:

class Items { 
    @observable items= []; 

    @action.bound 
    addItem() { 
    let newItem = new Item(); 
    this.items.push(newItem); 
    } 
} 

@observer 
class ItemPage extends Component { 
    render() { 
    const { addItem } = this.props.store; 
    return (
     <div className="items"> 
     <input type="button" value="add" onClick={addItem}/> 
     </div> 
    ); 
    } 
} 

const store = new Items(); 

或者:

class Items { 
    @observable items= []; 

    @action 
    addItem() { 
    let newItem = new Item(); 
    this.items.push(newItem); 
    } 
} 

@observer 
class ItemPage extends Component { 
    handleClick =() => { 
    this.props.store.addItem(); 
    }; 
    render() { 
    return (
     <div className="items"> 
     <input type="button" value="add" onClick={this.handleClick}/> 
     </div> 
    ); 
    } 
} 

const store = new Items(); 
+0

是@ action.bound推薦的更辦法嗎?似乎如果你不使用它,重複一個沒有真正收益的​​方法? – chobo2

+0

@ chobo2它真的只是歸結於偏好。我個人傾向於在我的組件上創建處理程序,如果我需要做的不僅僅是後來的行動,所以我通常選擇兩項。 – Tholle

+0

任何理由爲什麼,因爲它看起來像更多的工作,但沒有看到真正的任何收益。我還看到了第三個選項,他們將@action放在組件本身中。 – chobo2