【问题标题】:Rendering HTML from map function in React Context API render function从 React Context API 渲染函数中的地图函数渲染 HTML
【发布时间】:2018-07-13 07:44:52
【问题描述】:

我试图通过从<MyContext.Consumer> 组件内部调用状态映射来呈现标题列表,但代码没有返回列表项。但是,如果我执行console.log(dataImTryingToMap);,它会准确显示我要渲染的内容。 <ul> 被渲染,但没有 <li> 被渲染。 create-react-app 没有抛出任何错误。我错过了什么???这是消费者组件:

<MyContext.Consumer>
    {context => (
        <ul>
            {Object.keys(context.state.subjects).map(subject => {
                <li>{context.state.subjects[subject].title}</li>;
                console.log(context.state.subjects[subject].title);
             })}
        </ul>
    )}
</MyContext.Consumer>

控制台日志准确返回我正在查找的数据,但屏幕上没有显示任何内容。

这是来自&lt;MyContext.MyProvider&gt; 组件的状态:

state = {
    subjects: {
        subject0: {
            title: "Math",
            description: "",
            cards: {
                card1: {
                    note: "",
                    answer: ""
                }
            }
        },
        subject1: {
            title: "history",
            description: "",
            cards: {
                card1: {
                    note: "",
                    answer: ""
                }
            }
        }
    }
};

感谢您的帮助!

【问题讨论】:

    标签: javascript reactjs jsx map-function react-context


    【解决方案1】:

    Array.map() 回调没有返回任何内容:

    {Object.keys(context.state.subjects).map(subject => {
        <li>{context.state.subjects[subject].title}</li>; <-- this is not returned
        console.log(context.state.subjects[subject].title);
     })}
    

    const contextValue = { state: {"subjects":{"subject0":{"title":"Math","description":"","cards":{"card1":{"note":"","answer":""}}},"subject1":{"title":"history","description":"","cards":{"card1":{"note":"","answer":""}}}}}};
    
    
    const MyContext = React.createContext();
    
    const Example = () => (
      <MyContext.Consumer>
      {context => (
        <ul>
        {Object.keys(context.state.subjects).map(subject => {
          console.log(context.state.subjects[subject].title);
          return (
            <li key={subject}>{context.state.subjects[subject].title}</li>
          );
         })}
        </ul>
      )}
      </MyContext.Consumer>
    );
    
    const Demo = ({ value }) => (
      <MyContext.Provider value={value}>
        <Example />
      </MyContext.Provider>
    );
    
    ReactDOM.render(
      <Demo value={contextValue} />,
      demo
    );
    <script crossorigin src="https://unpkg.com/react@16.3/umd/react.development.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@16.3/umd/react-dom.development.js"></script>
    
    <div id="demo">
      </demo>

    【讨论】:

    • 隐式返回或添加“return”关键字不会改变任何东西(我会更新我的代码,我在发布之前隐式返回
    • )。
  • 在检查页面时, 元素以及其中的
      被渲染,但没有
  • 演示正在运行,如您所见。因此,找出演示和您的代码之间的差异。
  • 在测试中,如果我写在消费者组件中,我确实得到了我想要呈现的数据:

    {context.state.subjects.subject0.title}

    呈现“数学”到页面
  • 是的,是的,是的,在进行更多测试时,我已将“地图”更改为“forEach”,但忘记将其改回。太多的深夜编码......谢谢!
  • 【解决方案2】:

    您没有从 map 函数内部返回任何内容,因此它不会渲染任何内容。要么像这样明确地返回它

    <MyContext.Consumer>
        {context => (
            <ul>
                {Object.keys(context.state.subjects).map(subject => {
                    return <li>{context.state.subjects[subject].title}</li>;
                 })}
            </ul>
        )}
    </MyContext.Consumer>
    

    或隐含的喜欢

    <MyContext.Consumer>
        {context => (
            <ul>
                {Object.keys(context.state.subjects).map(subject => (
                     <li>{context.state.subjects[subject].title}</li>;
                ))}
            </ul>
        )}
    </MyContext.Consumer>
    

    【讨论】:

    • 隐式返回或添加“return”关键字不会改变任何东西(我会更新我的代码,我在发布之前隐式返回
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签