2017-08-14 69 views
0

我试图创建一个数组来存储我的分类链接,然后显示它们,但是我没有在我的DOM中显示任何内容。任何帮助,将不胜感激:)从Array React创建一个列表JS

import React from "react"; 
import { SidebarCategory } from './SidebarCategory'; 

class SidebarCategories extends React.Component { 
    constructor() { 
     super(); 
     this.state = { 
      categories: [] 
     } 
    } 

    componentWillMount() { 
     this.setState({categories: [ 
      { 
       id: 1, 
       icon: "icon", 
       title: "Home", 
      }, 
      { 
       id: 2, 
       icon: "icon", 
       title: "Gallery", 
      } 
     ]}); 
    } 

    render() { 
     return (
      <ul className="sidebar__categories container-fluid"> 
       {this.state.categories.map(category => { 
        return (
         <SidebarCategory key={category.id} title={category.title} /> 
        ) 
       })}; 
      </ul> 
     ); 
    } 
} 

export default SidebarCategories; 

编辑:

控制台错误:

bundle.js:357警告:React.createElement:类型无效 - 预期字符串(内置在组件中)或类/函数(用于复合组件),但得到:未定义。您可能忘记从您定义的文件中导出组件。检查Sidebar的渲染方法。 在侧栏(由应用程序创建的) 在DIV(由应用程序创建的) 在应用

sidebarCategory.js

import React from "react"; 

export class SidebarCategory extends React.Component { 
    render() { 
     const SidebarCategory = ({ title }) => { 
      return (<div className="sidebarCategory">{title}</div>); 
     } 
    } 
} 

sidebar.js:

import React from "react"; 

import { SidebarCategories } from "./SidebarCategories"; 

export class Sidebar extends React.Component { 
    render() { 
     return (
      <div className="sidebar col-sm-2"> 
       <div className="row"> 
        <div className="sidebar__header col"> 
         <img alt="Logo" className="img-fluid sidebar__header__logo" src="../resources/img/logo-white.png" /> 
         {'\u00A0'} <h4 className="i-block">Title</h4> 
        </div> 
       </div> 
       <div className="row"> 
        <div className="sidebar__user container-fluid"> 
         <div className="row"> 
          <div className="col-sm-4"> 
           <img alt="User DP" className="sidebar__user__img img-fluid rounded-circle" src="http://via.placeholder.com/100x100" /> 
          </div> 
          <div className="col-sm-8"> 
           <p><strong>Welcome</strong><br /> 
           Mark Hughes</p> 
          </div> 
         </div> 
        </div> 
       </div> 
       <div className="row"> 
        <SidebarCategories /> 
       </div> 
      </div> 
     ); 
    } 
} 

index.js:

import React from "react"; 
import { render } from "react-dom"; 

import Sidebar from "./components/sidebar"; 
import Content from "./components/content"; 

class App extends React.Component { 
    render() { 
     return (
      <div className="row"> 
       <Sidebar /> 
       <Content /> 
      </div> 
     ); 
    } 
} 

render(<App className="container-fluid"/>, window.document.getElementById("app")); 
+0

您是否收到任何控制台错误? –

+0

bundle.js:357警告:React.createElement:type无效 - 预期为字符串(对于内置组件)或类/函数(对于复合组件),但得到:未定义。您可能忘记将组件从其定义的文件中导出。检查“Sidebar”的渲染方法。 in Sidebar(由App创建) in div(由App创建) in App – MarkHughes88

+0

@ MarkHughes88您在哪里使用循环创建元素,还可以显示“SidebarCategory”组件? –

回答

1
import React from "react"; 
import SidebarCategory from './SidebarCategory'; 

class SidebarCategories extends React.Component { 
    constructor() { 
     super(); 
     this.state = { 
      categories: [] 
     } 
    } 

    componentWillMount() { 
     this.setState({categories: [ 
      { 
       id: 1, 
       title: "Home", 
      }, 
      { 
       id: 2, 
       title: "Gallery", 
      } 
     ]}); 
    } 

    render() { 
     return (
      <ul className="sidebar__categories container-fluid"> 
       <SidebarCategory categories={this.state.categories} /> 
      </ul> 
     ); 
    } 
} 

export default SidebarCategories; 

而在你SidebarCategory文件补充一点: -

import React from "react"; 

export class SidebarCategory extends React.Component { 
    render() { 
     return (
      <li className="sidebar__category container-fluid"> 
       <div className="row"> 
         <div className="col-sm-10"> 
          {this.props.categories.map((category, key) =>(
          <span key={key}>{category.title}</span> 
         ))} 
         </div> 
       </div> 
      </li> 
     ); 
    } 
} 
+0

谢谢。这解决了我的问题后,id用我的导入整理了{}。还有一个问题。这些类别中的每一个都有页面,我试图将它们映射到SidebarCategory的每个实例中。我是否正确地使用该语法并嵌套它? – MarkHughes88

1

此刻你还没有迭代哟你所持有的你的类别,所以首先是map在他们身上,并提供你的子组件<SidebarCategory>它所需要的数据;来自类别ID的关键字和标题。

render() { 
    return (
    <ul className = "sidebar__categories container-fluid"> 
    {this.state.categories.map(category => { 
     return (
     <SidebarCategory 
      key={category.title} 
      title={category.title} 
     /> 
    ) 
    })} 
    </ul> 
); 
} 

然后你<SidebarCategory>组件应返回div(例如)的标题是从您提供的它props填充。

const SidebarCategory = ({ title }) => { 
    return <div className="SidebarCategory">{title}</div> 
} 

export default SidebarCategory; 
+0

所以我正确的思想是通过它们在sidebarCategories渲染函数中进行映射,并在我的SidebarCategory组件中渲染一个const?因为这是我所做的,我仍然得到控制台错误,并没有在我的DOM – MarkHughes88

+0

你现在我得到这个错误:bundle.js:304未捕获的错误:SidebarCategory.render():一个有效的React元素(或null)必须返回。您可能返回了未定义的数组或其他无效对象。 – MarkHughes88

+0

用()包装返回值。应该是'return(

{title}
);' – Win

1

首先在SidebarCategories

import {SidebarCategory}... //with curly braces 

其次在边栏:

import SidebarCategories from "./SidebarCategories"; //without curly braces 

请参阅:

export class SidebarCategory //no default -> import {SidebarCategory} from... 
export default SidebarCategories; //with default -> import SidebarCategories from ... 
0

尝试这些: index.js

import React from "react"; 
import { render } from "react-dom"; 

import Sidebar from "./components/sidebar"; 
import Content from "./components/content"; 

class App extends React.Component { 
    render() { 
     return (
      <div className="row"> 
       <Sidebar /> 
       <Content /> 
      </div> 
     ); 
    } 
} 

render(<App className="container-fluid"/>, document.getElementById("app")); 

Sidebar.js

import React from "react"; 

import SidebarCategories from "./SidebarCategories"; 

class Sidebar extends React.Component { 
    render() { 
     return (
      <div className="sidebar col-sm-2"> 
       <div className="row"> 
        <div className="sidebar__header col"> 
         <img alt="Logo" className="img-fluid sidebar__header__logo" src="../resources/img/logo-white.png" /> 
         {'\u00A0'} <h4 className="i-block">Title</h4> 
        </div> 
       </div> 
       <div className="row"> 
        <div className="sidebar__user container-fluid"> 
         <div className="row"> 
          <div className="col-sm-4"> 
           <img alt="User DP" className="sidebar__user__img img-fluid rounded-circle" src="http://via.placeholder.com/100x100" /> 
          </div> 
          <div className="col-sm-8"> 
           <p><strong>Welcome</strong><br /> 
           Mark Hughes</p> 
          </div> 
         </div> 
        </div> 
       </div> 
       <div className="row"> 
        <SidebarCategories /> 
       </div> 
      </div> 
     ); 
    } 
} 

export default Sidebar; 

SidebarCategory.js

import React from "react"; 

class SidebarCategory extends React.Component { 
    render() { 
     return (
       <div className="row"> 
         <div className="col-sm-10"> 
          {this.props.category.title} 
         </div> 
       </div> 
     ); 
    } 
} 

export default SidebarCategory; 

SidebarCategories.js

import React from "react"; 
import SidebarCategory from './SidebarCategory'; 

class SidebarCategories extends React.Component { 
    constructor() { 
     super(); 
     this.state = { 
      categories: [] 
     } 
    } 

    componentWillMount() { 
     this.setState({categories: [ 
      { 
       id: 1, 
       title: "Home", 
      }, 
      { 
       id: 2, 
       title: "Gallery", 
      } 
     ]}); 
    } 

    render() { 
     let list = this.state.categories.map((category) => { 
      <li className="sidebar__category container-fluid" key={category.id}><SidebarCategory category={category} /></li> 
     }); 

     return (
      <ul className="sidebar__categories container-fluid"> 
       {list} 
      </ul> 
     ); 
    } 
} 

export default SidebarCategories; 
0

我相信问题出在您的sidebarCategory中。js,您在有状态的组件内创建了一个无状态(箭头函数)组件。

因为它只是一个从其道具渲染数据的组件,所以你可以像这样单独使用无状态/箭头函数。

const SidebarCategory = ({ title }) => { 
     return (<div className="sidebarCategory">{title}</div>); 
    } 
    export default SidebarCategory; // this way its exported as default component, import it without using curly brackets (import SidebarCategory from './SidebarCategory'; 
    // OR 
    export SidebarCategory; // this way its exported as non-default component, import it using the curly brackets (import {SidebarCategory} from './SidebarCategory';