【问题标题】:How do I add a button into a stateless component?如何将按钮添加到无状态组件中?
【发布时间】:2020-03-12 02:19:05
【问题描述】:

好的,

这个很简单,但我在这里花了几个小时试图弄清楚如何解决这个问题。

首先,我正在学习 React 课程,并且我第二次提交了该项目以供审阅者评估。当然不是同一个审稿人,他/她要求我进行与上一个不同的其他修改。

事实是,组件工作正常,但审阅者建议我将组件从类组件转换为函数组件,这就是我的问题开始的地方。

请原谅,但我必须把整个无状态组件代码(我认为这有点大),来解释接下来会发生什么:


import React from 'react';

import { Link } from 'react-router-dom';

import Book from './Book';



function Home (props) {

  return (

    <div className='list-books'>

      <div className='list-books-title'>

        <h1>MyReads</h1>

      </div>

      <div className='list-books-content'>

        <div>

          <div className='bookshelf'>

            <h2 className='bookshelf-title'>Currently Reading</h2>

            <div className='bookshelf-books'>

              <ol className='books-grid'>

              {

                  props.books

                    .filter(book => book.shelf === 'currentlyReading')

                    .map(book => (

                      <li key={book.id} >

                        <Book 

                          book={book}

                          changeShelf={props.changeShelf}

                          actualShelf='currentlyReading'

                        />

                      </li>

                    ))

                }

              </ol>

            </div>

          </div>

          <div className='bookshelf'>

            <h2 className='bookshelf-title'>Want to Read</h2>

            <div className='bookshelf-books'>

              <ol className='books-grid'>

                {

                  props.books

                    .filter(book => book.shelf === 'wantToRead')

                    .map(book => (

                      <li key={book.id} >

                        <Book 

                          book={book}

                          changeShelf={props.changeShelf}

                          actualShelf='wantToRead'

                        />

                      </li>

                    ))

                }   

              </ol>

            </div>

          </div>

          <div className='bookshelf'>

            <h2 className='bookshelf-title'>Read</h2>

            <div className='bookshelf-books'>

              <ol className='books-grid'>

              {

                  props.books

                    .filter(book => book.shelf === 'read')

                    .map(book => (

                      <li key={book.id} >

                        <Book 

                          book={book}

                          changeShelf={props.changeShelf}

                          actualShelf='read'

                        />

                      </li>

                    ))

                }

              </ol>

            </div>

          </div>

        </div>

      </div>

      <div className='open-search'>

        <Link to='/search'>

          <button onClick={() => this.setState({ showSearchPage: true })}>

            Add a book

          </button>

        </Link>

      </div> 

    </div>  

  );

}  


export default Home;

正如我所说,当组件是类组件时,一切都正常工作,但是当我将其转换为函数组件时,它在按钮渲染中出现错误(第 78 行,最后一个) ,对我来说出现的错误如下:

任何人都可以帮助我弄清楚如何将按钮添加到无状态组件中?

我想也许 setState 有什么可做的,我真的不知道。

提前致谢。

【问题讨论】:

标签: javascript node.js reactjs ecmascript-6 stateless


【解决方案1】:

如果要使用 showSeachPage 的值,请直接使用变量“showSearchPage”而不是 state.showSearchPage。这里该变量的默认值为 false。如果您想查看文档https://reactjs.org/docs/hooks-intro.html

import React, { useState } from 'react';

import { Link } from 'react-router-dom';

import Book from './Book';



function Home (props) {

const [showSearchPage, setShowSearchPage] = useState(false);

  return (

    <div className='list-books'>

      <div className='list-books-title'>

        <h1>MyReads</h1>

      </div>

      <div className='list-books-content'>

        <div>

          <div className='bookshelf'>

            <h2 className='bookshelf-title'>Currently Reading</h2>

            <div className='bookshelf-books'>

              <ol className='books-grid'>

              {

                  props.books

                    .filter(book => book.shelf === 'currentlyReading')

                    .map(book => (

                      <li key={book.id} >

                        <Book 

                          book={book}

                          changeShelf={props.changeShelf}

                          actualShelf='currentlyReading'

                        />

                      </li>

                    ))

                }

              </ol>

            </div>

          </div>

          <div className='bookshelf'>

            <h2 className='bookshelf-title'>Want to Read</h2>

            <div className='bookshelf-books'>

              <ol className='books-grid'>

                {

                  props.books

                    .filter(book => book.shelf === 'wantToRead')

                    .map(book => (

                      <li key={book.id} >

                        <Book 

                          book={book}

                          changeShelf={props.changeShelf}

                          actualShelf='wantToRead'

                        />

                      </li>

                    ))

                }   

              </ol>

            </div>

          </div>

          <div className='bookshelf'>

            <h2 className='bookshelf-title'>Read</h2>

            <div className='bookshelf-books'>

              <ol className='books-grid'>

              {

                  props.books

                    .filter(book => book.shelf === 'read')

                    .map(book => (

                      <li key={book.id} >

                        <Book 

                          book={book}

                          changeShelf={props.changeShelf}

                          actualShelf='read'

                        />

                      </li>

                    ))

                }

              </ol>

            </div>

          </div>

        </div>

      </div>

      <div className='open-search'>

        <Link to='/search'>

          <button onClick={() => setShowSearchPage(true)}>

            Add a book

          </button>

        </Link>

      </div> 

    </div>  

  );

}  


export default Home;

【讨论】:

  • Garry 和 @Abdou Djellal,感谢您最初的帮助。但是,我遇到了一个问题:它不起作用,因为我在我的机器上安装的 react-dom 是
  • 伙计们,加里和@Abdou Djellal。我已经进入 npm 页面并通过 shell 安装 react-dom。它奏效了。对不起这个问题。我是开发领域的新手,所以有时我会陷入一些基本的东西。还是谢谢!
  • @jose-renato-m 没问题。这是每个人的旅程。如果您有任何其他问题,请继续在此处发布。一切顺利:)
【解决方案2】:

为了从功能组件中获得与类组件相同的效果,您需要使用状态挂钩:https://reactjs.org/docs/hooks-overview.html#state-hook

尝试阅读文档并不难,它会帮助你变得更好!

在你的例子中使用这个:

const [showSearchPage, setShowSearchPage] = useState(false);

当你点击按钮时使用

<button onClick={() => setShowSearchPage(true)}>

"setShowSearchPage(true)" 会产生和 setState 一样的效果 this.setState({ showSearchPage: true })}

希望对您有所帮助!请再次阅读文档以更好地掌握功能组件中的状态挂钩

【讨论】:

    猜你喜欢
    • 2016-03-05
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多