2017-02-16 47 views
0

在下面的組件中設置obsrv數組;反應在組件中獲得可觀察值

class AnnouncementState { 
    @observable categories =[]; 
    constructor(){ 
     this.getAnnouncementCategory(); 
    } 

    getAnnouncementCategory() { 
    fetch(`..`) 
     .then((response) => { 
     return response.json(); 
     }) 
     .then((response) => { 
     this.categories = response.value.map((item , i)=>{ return {Id:item.Id, Title:item.Title} }); 
     }, (error) => { 
     }); 
    } 
} 

我檢查了檢索到的值,確定。我嘗試在組件中設置它並將其渲染到下面;

@observer 
class AnnouncementComponent extends React.Component { 
    categories = []; 
    componentWillMount(){ 
    debugger 
    this.categories=this.props.announcement.categories; 
    } 

    render() { 
    const listItems = this.categories.map((item) => { 
     return (<li>...</li>) 
    }); 

    return (
      <div id="announcements-tab"> 
      List Items: 
      <ul className="nav nav-tabs"> 
       {listItems} 
      </ul> 
      </div> 
    ); 
    } 
} 

我希望看到所有列表項,但沒有在HTML(僅「listItems中的」串),在控制檯中沒有錯誤。我如何修復和調試它?使用「調試器」關鍵字沒有顯示任何可觀察的。

回答

2

在代碼中,我沒有看到你在哪裏創造AnnouncementState實例。這裏舉一個例子,你如何得到類別列表。
例如

class AnnouncementState { 

    @observable categories =[]; 

    @action getAnnouncementCategory() { 
     fetch(`..`) 
      .then((response) => { 
     return response.json(); 
      }) 
      .then((response) => { 
     this.categories = response.value.map((item , i)=>{ return {Id:item.Id, Title:item.Title} }); 
      }, (error) => { 
      }); 
     } 
} 

export default new AnnouncementState(); //here you can create the instance. 


@observer 
@inject('store') //here substitute with your store name, the name you set in your provider 
class AnnouncementComponent extends React.Component { 

    componentWillMount(){ 
    debugger 
    this.props.store.getAnnouncementCategory(); 
    } 

    render() { 
    const listItems = this.props.store.categories.map((item) => { 
     return (<li>...</li>) 
    }); 

    return (
      <div id="announcements-tab"> 
      List Items: 
      <ul className="nav nav-tabs"> 
       {listItems} 
      </ul> 
      </div> 
    ); 
    } 
} 

這應該工作,只要確保你傳遞正確的存儲與<Provider store={store}>

+0

「@Inject(‘商店’)」我看到這個東西注入一些地方,我爲什麼需要它?它是依賴注入嗎?我沒有使用注入,但我的代碼仍然有效,所以你什麼時候需要它? – TyForHelpDude

+2

例如,當您在另一個組件內部有組件時,爲了避免一直沿着您的商店向下傳遞,只需使用Provider來傳遞存儲,然後使用Inject將該實例接收到該特定組件上。 – Hosar