将道具传递给兄弟姐妹reactJS时未定义

Posted

技术标签:

【中文标题】将道具传递给兄弟姐妹reactJS时未定义【英文标题】:Undefined when passing props to siblings reactJS 【发布时间】:2019-05-07 16:34:50 【问题描述】:

新的 react 并试图传递,props 到带有 react 的组件。但在 Track.js 中接收 this.props.name 时会得到 undefined 结果。和TypeError: Cannot read property 'name' of undefined 在 Track.js 渲染方法中尝试使用 this.props.track.name 时。

它应该渲染这些轨道:

            tracks: [
                name: 'Gold Slug',
                artist: 'DJ khaled',
                album: 'We da best',
                id: '102 sample ID'
            ,
                
                    name: 'Slim shady',
                    artist: 'Eminem',
                    album: 'Marshal materials',
                    id: '103 sample ID'
                

或者这条赛道:

        searchResults: [
            name: 'You Mine',
            artist: 'DJ Khaled',
            album: 'I Changed a Lot',
            id: '101 sample ID'
        ],

背景信息:构建一个应用程序来呈现带有名称、艺术家和专辑的歌曲曲目。还有搜索结果和播放列表的搜索。我正在使用 6 个组件:App、PlayList、SearchBar、SearchResults、Track 和 TrackList。

App 是一个容器。 PlayList 允许用户向其中添加曲目。 SearchResults 显示来自 SearchBar 的结果。

在 App.js 中,我在构造方法中设置了 searchResults 的状态并将其传递给组件。

App.js:

import React from 'react';
import './App.css';
import SearchBar from '../SearchBar/SearchBar'
import SearchResults from "../SearchResults/SearchResults";
import Playlist from "../Playlist/Playlist";    

class App extends React.Component 
    constructor(props) 
        super(props);
        this.state = 
            searchResults: [
                name: 'You Mine',
                artist: 'DJ Khaled',
                album: 'I Changed a Lot',
                id: '101 sample ID'
            ],
            tracks: [
                name: 'Gold Slug',
                artist: 'DJ khaled',
                album: 'We da best',
                id: '102 sample ID'
            ,
                
                    name: 'Slim shady',
                    artist: 'Eminem',
                    album: 'Marshal materials',
                    id: '103 sample ID'
                
            ]
        ;
    

    render() 
    return (
        <div>
            <h1>Ja<span className="highlight">mmm</span>ing</h1>
            <div className="App">
                <SearchBar />
                <div className="App-playlist">
                    <SearchResults searchResults=this.state.searchResults/>
                    <Playlist />
                </div>
            </div>
        </div>
    );
  


export default App;

SearchResults 接收并 .map 遍历数组,并将其设置为 render 方法中 TrackList 组件内的轨道。

SearchResults.js:

import React from 'react';
import './SearchResults.css'
import TrackList from "../TrackList/TrackList";
import Track from "../Track/Track";

class SearchResults extends React.Component 
    render() 
        return (
            //Adds a map method that renders a set of Track components on the tracks attribute.
            <div className="SearchResults">
                <h2>Results</h2>
                <TrackList tracks=this.props.searchResults.map(track => 
                    return <Track key=track.id /> 
                ) />
            </div>
        )
    


export default SearchResults;

TrackList.js 渲染一组轨道组件:

import React from 'react';
import './TrackList.css'
import Track from '../Track/Track'

class TrackList extends React.Component 
    render() 
        return (

            <div className="TrackList">
                <Track />
                <Track />
                <Track />
                <Track />
            </div>
        )
    



export default TrackList;

Track.js 渲染轨道:

import React from 'react';
import './Track.css'

class Track extends React.Component 

    renderAction() 
        if (this.props.isRemoval == true) 
            return <h1>-</h1>;
         else 
            return <h1>+</h1>;
        
       

    //TODO: Fix rendering method on this.props.track.name
    render() 
        return (
            <div className="Track">
                <div className="Track-information">
                    <h3>this.props.name</h3>
                    <p>`$this.props.artist | $this.props.album`</p>
                </div>
                <a className="Track-action" isRemoval=true></a>
            </div>
        )
    


export default Track;

【问题讨论】:

您没有将任何道具传递给&lt;Track&gt; 组件 【参考方案1】:

这里的问题是您实际上并没有将数据向下传递给Track 组件。

class SearchResults extends React.Component 
    render() 
        return (
            //Adds a map method that renders a set of Track components on the tracks attribute.
            <div className="SearchResults">
                <h2>Results</h2>
                <TrackList tracks=this.props.searchResults.map(track => 
                    return <Track key=track.id /> 
                ) />
            </div>
        )
    

似乎SearchResults 正在尝试映射通过道具获取的数据,并为每个数据渲染一个Track。现在,如果您在此处查看此行,您会注意到实际上没有传递任何数据。

return &lt;Track key=track.id /&gt;

我认为要解决您的问题,您需要做的就是这个。

class SearchResults extends React.Component 
    render() 
        return (
            //Adds a map method that renders a set of Track components on the tracks attribute.
            <div className="SearchResults">
                <h2>Results</h2>
                <TrackList tracks=this.props.searchResults.map(track => 
                    return <Track key=track.id track=track /> 
                ) />
            </div>
        )
    

现在您可以在Track 组件中访问this.props.track.whatever

【讨论】:

以上是关于将道具传递给兄弟姐妹reactJS时未定义的主要内容,如果未能解决你的问题,请参考以下文章

将状态传递给子组件时未定义状态

在 setState 不起作用后,Reactjs 将值作为道具传递

Rails 6 - 传递给部分时未定义的局部变量,但当我将调试器放入 erb 文件时定义了它

传递给子组件时道具未定义(反应钩子)

将两个道具从父组件传递给子组件会导致父组件未定义

传递给子组件的道具未定义,但 console.log 显示道具的值