2016-08-07 17 views
0

サブコンポーネントをレンダリングしないコンポーネントがあります。コンソールにエラーはありません。私はWeb呼び出しから必要なデータを取得しますが、エラーはありません。プロジェクトコンポーネントが何もレンダリングしていない理由は不明です。レンダリングされないコンポーネント

別のファイルに

データ検索機能:

window.getCurrentUsersGroups = function() { 
    var d = $.Deferred(); 
    var currentUsersBusinessArea = null; 

    var userGroups = $().SPServices({ 
    operation: "GetGroupCollectionFromUser", 
    userLoginName: $().SPServices.SPGetCurrentUser() 
    }); 

    userGroups.then(function(response) { 
    var groups = []; 

    $(response).find("Group").each(function() { 
     var self = $(this); 
     groups.push(self.attr("Name")) 
    }); 

    currentUsersBusinessArea = _.filter(groups, function(group) { 
     return _.startsWith(group, "BusinessArea") 
    }); 
    d.resolve(getListings(currentUsersBusinessArea[0])) 
    }) 
    return d.promise(); 
} 

window.getListings = function(businessArea) { 
    var d = $.Deferred(); 
    var projects = []; 

    var listings = $().SPServices.SPGetListItemsJson({ 
    listName: "Projects", 
    CAMLQuery: "<Query><Where><Eq><FieldRef Name='" + businessArea + "'/><Value Type='String'>Unassigned</Value></Eq></Where></Query>" 
    }); 

    listings.then(function() { 
    var result = this.data; 

    result.map(function(project){ 
     projects.push({ 
     id: project.ID, 
     pID: project.ProjectID, 
     title: project.Title, 
     status: project.Status, 
     created: project.Created, 
     businessArea: project.BusinessAreaFinanceAccounting, 
     sponsor: project.SponsoringArea, 
     comments: project.Comments 
     }) 
    }) 
    d.resolve({businessArea: businessArea, projects: projects}) 
    }) 
    return d.promise(); 
} 

リストコンポーネント:

class Listings extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     businessArea: null, 
     projects: [], 
    }; 
    }; 

    componentDidMount() { 
    let that = this; 
    window.getCurrentUsersGroups().then(function(response) { 
     response.then(function(data){ 
     that.setState({businessArea: data.businessArea}) 
     that.setState({projects: data.projects}) 
     }) 
    }) 
    }; 

    render() { 
    let {businessArea, projects} = this.state; 
    console.log(this.state) 

    return (
     <section className="listingsContainer"> 
     <h3>{businessArea}</h3> 

     <hr></hr> 

     <table className="ms-Table"> 
      <thead> 
       <tr> 
       <th>Edit</th> 
       <th>Project ID</th> 
       <th>Project Name</th> 
       <th>Response Status</th> 
       <th>Initiated Date</th> 
       <th>BA Impact</th> 
       <th>Sponsor</th> 
       <th>Comments</th> 
       </tr> 
      </thead> 
      <tbody> 
      { 
       projects.map(function({project,index}) { 
       console.log(project.ID) 
       return <Project key={project.id} project={project} index={index} /> 
       }) 
      } 
      </tbody> 
     </table> 
     </section> 
    ) 
    } 
} 

プロジェクトコンポーネント:

const Project = ({project, index}) => { 
    return (
    <tr key={index + project.ID}> 
     <td> 
     <a href={_spPageContextInfo.webAbsoluteUrl + '/SitePages/Business%20Project%20Edit.aspx?ProjectID=' + project.ID}> 
      <span style="font-size:1em;" className="ms-Icon ms-Icon--editBox"></span> 
     </a> 
     </td> 
     <td>{project.ProjectID}</td> 
     <td>{project.Title}</td> 
     <td>{project.Status}</td> 
     <td>{project.Created}</td> 
     <td>{project.BusinessAreaFinanceAccounting}</td> 
     <td>{project.SponsoringArea}</td> 
     <td>{project.Comments}</td> 
    </tr> 
); 
}; 

ブラウザ結果:

もしI出力$ rをにコンソール、リストコンポーネントの状態にはプロジェクトがあります。しかし、反応開発ツールは配列が0でレンダリングがないと言っています。混乱している。

enter image description here

+0

なぜ反応してjQueryを使用していますか?そしてこのバインディングは無効です。 '​​project.ProjectID'中括弧が必要です –

+0

'render()'に 'data.length'とは何ですか? – robertklep

+0

プロジェクトデータをレンダリングする '​​'の中に中括弧がありません。 '​​{project.ProjectID}' –

答えて

1

あなたは中括弧を使用してprojectをラップするのを忘れように思える:ここ

const Project = ({project}) => { 
    return (
    <tr> 
     <td> 
     <a href={_spPageContextInfo.webAbsoluteUrl + '/SitePages/Business%20Project%20Edit.aspx?ProjectID=' + project}> 
      <span style="font-size:1em;" className="ms-Icon ms-Icon--editBox"></span> 
     </a> 
     </td> 
     <td>{project.ProjectID}</td> 
     <td>{project.Title}</td> 
     <td>{project.Status}</td> 
     <td>{project.Created}</td> 
     <td>{project.BusinessAreaFinanceAccounting}</td> 
     <td>{project.SponsoringArea}</td> 
     <td>{project.Comments}</td> 
    </tr> 
); 
}; 

は、コンポーネントのを処理するためのよりよい方法です:

class Listings extends React.Component { 

constructor(props) { 
    super(props); 
    this.state = { 
     data: [], 
     businessArea: null 
    }; 
    } 

    componentDidMount() { 
    let that = this; 
    let groups = []; 

    let userGroups = $().SPServices({ 
     operation: "GetGroupCollectionFromUser", 
     userLoginName: $().SPServices.SPGetCurrentUser() 
    }); 

    userGroups.then((response) => { 

     $(response).find("Group").each(function() { 
     let self = $(this); 
     groups.push(self.attr("Name")) 
     }); 

     let currentUsersBusinessArea = _.filter(groups, (group) => _.startsWith(group, "BusinessArea")); 
     this.setState({businessArea: currentUsersBusinessArea}) 
    }).then(getListings) 

    function getListings() { 
     let listings = $().SPServices.SPGetListItemsJson({ 
     listName: "Projects", 
     CAMLQuery: "<Query><Where><Eq><FieldRef Name='" + that.state.businessArea + "'/><Value Type='String'>Unassigned</Value></Eq></Where></Query>" 
     }); 

     listings.then(function() { 
     that.setState({data: this.data}); 
     }) 
    }; 
    } 

    render() { 
    let {data, businessArea} = this.state; 
    return (
     <section className="listingsContainer"> 
     <h3>{`Business Area ${businessArea}`}</h3> 
     <hr></hr> 
     <table className="ms-Table"> 
      <thead> 
      <tr> 
       <th>Edit</th> 
       <th>Project ID</th> 
       <th>Project Name</th> 
       <th>Response Status</th> 
       <th>Initiated Date</th> 
       <th>BA Impact</th> 
       <th>Sponsor</th> 
       <th>Comments</th> 
      </tr> 
      </thead> 
      <tbody> 
      {data.map({project,index}) => <Project key={index} project={project} /> } 
      </tbody> 
     </table> 
     </section> 
    ) 
    } 
} 

const Project = ({project}) => (
    <tr> 
     <td> 
     <a href={_spPageContextInfo.webAbsoluteUrl`/SitePages/Business%20Project%20Edit.aspx?ProjectID=${project}`}> 
      <span style={{'fontSize':'1em'}} className="ms-Icon ms-Icon--editBox"></span> 
     </a> 
     </td> 
     <td>{project.ProjectID}</td> 
     <td>{project.Title}</td> 
     <td>{project.Status}</td> 
     <td>{project.Created}</td> 
     <td>{project.BusinessAreaFinanceAccounting}</td> 
     <td>{project.SponsoringArea}</td> 
     <td>{project.Comments}</td> 
    </tr> 
); 

ヒント:でのjQueryを混ぜることはありません反応成分

+0

私は両方を一緒に使うことができないことを知りませんでした。私は、データの取得とそのすべてをコンポーネント内に保持すると考えていました。データを整理するためにjQueryが必要です。私はどこでそれをすると思いますか?デカップリングのチケットをありがとう、ちょうど私が好きな 'tbdody'に' data.map'を入れていただきありがとうございます。 – Batman

+0

@Batman反応コンポーネントの外に入ってくるデータを扱います反応とは何を使用しますか? –

+0

Reactで何を使用しますか?どのライブラリと同様?また、 'componentDidMount()'のすべてのコードが別の場所にあるはずですか? – Batman

0

それがレンダリングされなかった主な理由は、この表のセルは次のとおりです。

<td> 
    <a href={_spPageContextInfo.webAbsoluteUrl + '/SitePages/Business%20Project%20Edit.aspx?ProjectID=' + project.ID}> 
     <span style="font-size:1em;" className="ms-Icon ms-Icon--editBox"></span> 
    </a> 
    </td> 

styleプロパティとしてspanタグ。それは私が見ることができないものからレンダリングするのを妨げている。

関連する問題