2017-04-09 3 views
-2

私はreactjs api jsonコールバックと混同しています。reactjsの値をマップする方法は?

私のコンテナで>>私はこれからAPI応答を持っています - > let broadcast = this.props.broadcastDetailsPageApiResponse;

私は、コンポーネントページのHTMLにそれを印刷するための「broadcastData」変数に値をマッピングする必要があります。(「チャンネル」、「説明」のようなfileds、「recordedUrl」、

私はそれをどのように行うことができますか?

APIレスポンスは次のよう

broadcastdetailcontainer.jsx:。にconsole.logをマッピングする場所( "マッピングする必要があります");行なし34

import React, {Component} from 'react' 
import {connect} from 'react-redux' 
import {bindActionCreators} from 'redux'; 
import BroadcastDetailPage from '../components/broadcastList/broadcastDetailPage.jsx' 
import * as detailPageActions from '../actions/detailPageActions.jsx' 

class BroadcastDetailContainer extends Component { 
    constructor(props) { 
     super(props); 
     this.state = {broadcastData: {}}; 
     this.updateBroadcastData = this.updateBroadcastData.bind(this); 
    } 

    componentDidMount() { 
     let broadcastId = this.props.params.broadcastId; 
     console.log("Broadcast Id in the componentDidMount: " + broadcastId); 
     this.updateBroadcastData(broadcastId); 
    } 


    updateBroadcastData(broadcastId) { 
     let broadcastData; 
     let broadcast = this.props.broadcastDetailsPageApiResponse; 
     // console.log("broadcast: " + JSON.stringify(broadcast)); 

     if (broadcast != null) { 


///////////////////////////////////////////////////////////////// 

       broadcastData = broadcast.channel; 
       broadcastData = broadcast.user; 

      console.log("need to map"); 
      //console.log(broadcastData); 

///////////////////////////////////////////////////////////////// 
     } 

     let content = this.props.homePageApiResponse.content; 
     if (content != null & broadcastData == null) { 
      console.log('entered when the home API'); 
      for (let i = 0; i < content.length; i++) { 
       if (content[i].id == broadcastId) { 
        broadcastData = content[i]; 
        break; 
       } 
      } 
     } 
     if (broadcastData == null) { 
      content = this.props.searchPageApiResponse.content; 
      if (content != null) { 
       console.log('entered when the search API'); 
       for (let i = 0; i < content.length; i++) { 
        if (content[i].id == broadcastId) { 
         broadcastData = content[i]; 
         console.log(broadcastData); 
         break; 
        } 
       } 
      } 
     } 

     if (broadcastData == null) { 
      this.props.actions.callDetailApi(broadcastId); 
     } 
     else{ 
      this.setState({broadcastData: broadcastData}); 
     } 

    } 

    componentWillReceiveProps(nextProps) { 
     let broadcastId = nextProps.params.broadcastId; 
     console.log('componentWillReceiveProps'); 
     this.updateBroadcastData(broadcastId); 
    } 


    render() { 
     //console.log("rendered: "+JSON.stringify(this.props.broadcastDetailsPageApiResponse)); 
     return (
      <div> 
       {this.state.broadcastData && 
       <BroadcastDetailPage 
        broadcastDetail={this.state.broadcastData}/> 
       } 
      </div> 
     ) 
    } 
} 

const mapStateToProps = (state) => ({ 
    homePageApiResponse: state.homePageApiResponse, 
    searchPageApiResponse: state.searchPageApiResponse, 
    broadcastDetailsPageApiResponse: state.detailPageApiResponse, 
}) 

function mapDispatchToProps(dispatch) { 
    return { 
     actions: bindActionCreators(detailPageActions, dispatch) 
    }; 
} 

export default connect(
    mapStateToProps, 
    mapDispatchToProps 
) 
(BroadcastDetailContainer) 

を私はマップVAを表示する必要があります梅毒、次のコンポーネントページに:

import React, {Component} from "React"; 
import {Row, Clearfix} from "react-bootstrap/lib"; 
import VideoPlayer from "./videoPlayer.jsx"; 

class BroadcastDetailPage extends Component { 
    render() { 
     let broadcastData = this.props.broadcastDetail; 

     return (
      <Row> 
       <div className="popup-cont-container"> 
        <VideoPlayer broadcastData={broadcastData}/> 
        <div className="video-info"> 
         <div className="info-left"> 
          <div className="main-tag"> 
           <a href="#"># {broadcastData.channel} </a> 
          </div> 
          <div className="datenTime"> 
           On Date 
          </div> 
          <div className="datenTime"> Location 
          </div> 
          <div className="video-info-main"> </div> 
          <div className="at">@ 
           <a href="#">{broadcastData.handle} </a></div> 
         </div> 
         <div className="info-right"> 
          <span><img src="images/eyeico.png"/> 
           <a> </a> Live viewers 
          </span> 
          <span><img src="images/heart.png"/> 
           <a> </a> Likes 
          </span> 
         </div> 
        </div> 
        <Clearfix/> 
       </div> 
      </Row> 
     ); 
    } 
} 
export default BroadcastDetailPage 





{"id":4,"user":{"userId":1,"chatUserId":0,"handle":"satishkrypto","countryCode":"+971","phone":"569942359","picUrl":"https://ss-ap-southeast-1.amazonaws.com/production-speakerswire-images/user-profiles/male3x.png","userStat":{"id":1,"followers":4,"followings":5,"broadcastLikes":0,"broadcastViews":90},"name":"satish verma","existingUser":false,"userProfileImageType":"MALE","invitesLeft":4,"userPriviledge":"SW_BROADCASTER"},"description":"satish's Broadcast","streamId":"pub11489928734882","audio":false,"screenShotUrl":"https://ss-api-eb-dev.s3-ap-southeast-1.amazonaws.com/broadcast-images/pub11489928734882-1489928751454.jpg","recordedUrl":"https://production-ss-videos-red5pro.s3-ap-southeast-1.amazonaws.com/video/record/pub581489997130311.mp4","status":"RECORDED","type":"PUBLIC","locationEnabled":false,"commentsEnabled":true,"channel":{"channelId":14,"channel":"Productivity","color":"#4A148C","priority":986,"created":1489922543000,"updated":1489922543000,"broadcast":0,"liveBroadcast":0},"broadcastStat":{"id":4,"likes":0,"views":14,"viewers":5,"liveViewers":0},"latitude":0.0,"longitude":0.0,"startTime":1489928737000,"endTime":1489928787000,"updated":1489928737000,"event":{"id":4,"description":"satish's Broadcast","type":"BROADCAST_PUBLIC","startTime":1489928737000,"endTime":1489928787000,"status":"FINISHED","eventReminderStatus":"NOT_SENT","updatedAt":1489928787000},"expectedDuration":0,"serviceProvider":"agora"} 

更新:あなたはQUESで指定

broadcastData = { 
        ...broadcast, 
        broadcaster: { 
         name: broadcast.user.name, 
         handle: broadcast.user.handle 
        }, 
        channel: { 
         // channelName: broadcast.channel 
        }, 
        likes: broadcast.broadcastStat.likes, 
        views: broadcast.broadcastStat.views, 
       } 
+1

応答Uが取り付けられていることは、Pでありませんローパー 'json'フォーマット。適切な 'json'でquesを編集するか、' console.log() 'の結果のスクリーンショットを添付してください –

+1

これはReact関連の問題のようには思えません。それはあなたのような音のようにあなた自身の機能を書くことに煩わされることはありませんので、他の人にあなたのためにそれをするように求めています。 – d4nyll

+0

json – gitu

答えて

0

値は、あなたがdata.channel.any_key, data.description, data.recordedUrlでそれらにアクセスすることができ、直接object内部に存在しています。

data.channelのすべての値を印刷する場合は、mapを使用してください。それ以外の場合はdata.channel.channelで直接アクセスできます。

チェックこの例:

let data = { 
 
    \t "id":4, 
 
    \t "user":{ 
 
    \t \t "userId":1, 
 
    \t \t "chatUserId":0, 
 
    \t \t "handle":"satishkrypto", 
 
    \t \t "countryCode":"+971", 
 
    \t \t "phone":"569942359", 
 
    \t \t "picUrl":"https://ss-ap-southeast-1.amazonaws.com/production-speakerswire-images/user-profiles/male3x.png", 
 
    \t \t "userStat":{ 
 
    \t \t \t "id":1, 
 
    \t \t \t "followers":4, 
 
    \t \t \t "followings":5, 
 
    \t \t \t "broadcastLikes":0, 
 
    \t \t \t "broadcastViews":90 
 
    \t \t }, 
 
    \t \t "name":"satish verma", 
 
    \t \t "existingUser":false, 
 
    \t \t "userProfileImageType":"MALE", 
 
    \t \t "invitesLeft":4, 
 
    \t \t "userPriviledge":"SW_BROADCASTER" 
 
    \t }, 
 
    \t "description":"satish's Broadcast", 
 
    \t "streamId":"pub11489928734882", 
 
    \t "audio":false, 
 
    \t "screenShotUrl":"https://ss-api-eb-dev.s3-ap-southeast-1.amazonaws.com/broadcast-images/pub11489928734882-1489928751454.jpg", 
 
    \t "recordedUrl":"https://production-ss-videos-red5pro.s3-ap-southeast-1.amazonaws.com/video/record/pub581489997130311.mp4", 
 
    \t "status":"RECORDED", 
 
    \t "type":"PUBLIC", 
 
    \t "locationEnabled":false, 
 
    \t "commentsEnabled":true, 
 
    \t "channel":{ 
 
    \t \t "channelId":14, 
 
    \t \t "channel":"Productivity", 
 
    \t \t "color":"#4A148C", 
 
    \t \t "priority":986, 
 
    \t \t "created":1489922543000, 
 
    \t \t "updated":1489922543000, 
 
    \t \t "broadcast":0,"liveBroadcast":0 
 
    \t }, 
 
    \t "broadcastStat":{ 
 
    \t \t "id":4, 
 
    \t \t "likes":0, 
 
    \t \t "views":14, 
 
    \t \t "viewers":5, 
 
    \t \t "liveViewers":0 
 
    \t }, 
 
    \t "latitude":0.0, 
 
    \t "longitude":0.0, 
 
    \t "startTime":1489928737000, 
 
    \t "endTime":1489928787000, 
 
    \t "updated":1489928737000, 
 
    \t "event":{ 
 
    \t \t "id":4, 
 
    \t \t "description":"satish's Broadcast", 
 
    \t \t "type":"BROADCAST_PUBLIC", 
 
    \t \t "startTime":1489928737000, 
 
    \t \t "endTime":1489928787000, 
 
    \t \t "status":"FINISHED", 
 
    \t \t "eventReminderStatus":"NOT_SENT", 
 
    \t \t "updatedAt":1489928787000 
 
    \t }, 
 
    \t "expectedDuration":0, 
 
    \t "serviceProvider":"agora" 
 
    }; 
 
    
 
class App extends React.Component{ 
 
    render(){ 
 
     return(
 
     <div> 
 
      Channel Details: {Object.keys(data.channel).map(el=>{ 
 
       return <p>{el}: {data.channel[el]}</p> 
 
      })} 
 
      Description: {data.description} 
 
      RecordedUrl: {data.recordedUrl} 
 
     </div> 
 
    ) 
 
    } 
 
} 
 

 
ReactDOM.render(<App/>, document.getElementById('app'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 

 
<div id='app'/>

+0

@gituを例に指定したのと同じ方法で使用します.2ページ目でも動作します。変数の名前を変更する必要があります。 'data'を使用し、' let broadcastData = this.props.broadcastDetail; '、' broadcastData'を使用し、第2ページで同じコードを使用します。何かエラーが発生した場合はお知らせください:) –

+0

私はlet broadcast = this.props.broadcastDetailsPageApiResponse; broadcastData = broadcast;最初のページにあり、2番目の{broadcastData.channel}で以下を試しました。 "詳細ページのエラーページapi call不変違反:オブジェクトがリアクションの子として有効ではありません(found:キー{channelId、channel、color、priority、created 、updated、broadcast、liveBroadcast})子供のコレクションをレンダリングする場合は、代わりに配列を使うか、ReactアドオンのcreateFragment(オブジェクト)を使ってオブジェクトをラップします。 – gitu

+0

チャンネルはオブジェクトなのでJSXで直接印刷することはできません。例のようにmapを使用するか、 '{broadcastData.channel.channel}'のようにアクセスしたい値を指定します。 –

1

成分1

render() { 
     return (

      <div className="flexslider tabs_slider no-slide"> 
       <ul className="slides"> 

        {this.state.Movies.map((item, index) => <Component2 
         key={item.db_recom_id} 
         item={item} 
        />)} 

       </ul> 
      </div> 
     ) 
    } 

成分2

render() { 

     return (
      <li> 

        <img className="wrap_me" src={this.props.item.db_movies_img} /> 
     ) 
    } 
関連する問題