React组件不呈现来自父级的道具

时间:2017-05-28 15:54:22

标签: javascript reactjs react-jsx

 class CyInfo extends Component {

    foo(){
        console.log(this.props.id);
        return getAttributes(this.props.id)
    }

    render() {
        return ( <Info data = {this.foo()}> </Info>)
    }
}

此父母收到&#34; props.id&#34;并将数据值传递给getAttributes()返回的子项。

export default class Info extends Component {
    constructor(props){
        super(props)
    }

    /*componentWillReceiveProps(nextProps){
        console.log(nextProps);
    */

    render() {
        console.log(this.props.data);
        return (
            <div id="info">{this.props.data}</div>
        )
    }
}

在孩子上,我可以在控制台和componentWillReceiveProps中看到道具值。但是不能渲染数组。 我尝试使用react-devtool。在react-devtool道具似乎传递了孩子而不是渲染。有趣的是,当我改变一些数组的元素数组时,react-devtool正在呈现。

我做错了什么。

编辑: [React-Devtool截图] [1]

我编辑了react-devtool截图。看似道具,但组件只呈现初始值。在屏幕截图控制台错误是favicon只是忽略这个

EDIT2:Console prints props array

编辑3: JSON.stringify(this.props.data)

3 个答案:

答案 0 :(得分:1)

道具来自函数(getattributes),它调用异步方法,当这个道具传递给子节点时,它不会渲染。 我直接在父子中调用async方法,并在componentWillReceiveProps中使用回调设置状态:

componentWillReceiveProps(nextProps){
    self = this;
    AsyncFunc(nextProps.id ,(error, result) => {
        self.setState({data:result})
    });
}

并使用

进行渲染
    return (<div id="info">
        {Array.isArray(this.state.data) && this.state.data.map((data) => {
            return <div key={data._id}>{data.class}{data.predicate}{data.yuklem}</div>
        })}</div>
    )

答案 1 :(得分:0)

由于foo是一个函数,您必须将子组件传递给:

return ( <Info data = {() => this.foo()}> </Info>)

此外,数据数组,您必须使用.map()进行呈现,如下所示:

export default class Info extends Component {
    constructor(props){
        super(props)
    }

    /*componentWillReceiveProps(nextProps){
        console.log(nextProps);
    */

    render() {
        console.log(this.props.data);
        return (
           <div id="info">{this.props.data.map(( element, index ) => {
            console.log(element);
            <span key={index}> {element}</span>})}
           </div>
        )
    }
}

答案 2 :(得分:0)

正如您所提到的,this.data.props返回一个数组,并且为了在数组中呈现元素,您需要映射数组元素并在最初渲染之前检查data is an array or not值可能不可用或不是数组

export default class Info extends Component {
    constructor(props){
        super(props)
    }

    /*componentWillReceiveProps(nextProps){
        console.log(nextProps);
    */

    render() {
        console.log(this.props.data);
        return (
            <div id="info">
               {this.props.data && Array.isArray(this.props.data) && this.props.data.map((data, index) => {
                      return <div key={index}>{data}</div>
               })}</div>
        )
    }
}