【问题标题】:HTML JavaScript React: Front-End React Component Throwing react-dom.development.js:506 WarningHTML JavaScript React:前端 React 组件抛出 react-dom.development.js:506 警告
【发布时间】:2020-01-22 18:36:09
【问题描述】:

我已经使用 JSX 语法渲染了一个前端 react / redux 组件。它执行但在我的控制台中抛出以下警告:

下面是我的代码:

import React from 'react'
import {connect} from 'react-redux'
import {getUsers, deleteUserThunk} from '../store/allUsers'
import {updateUserThunk, fetchSingleUser} from '../store/singleUser'
// Status Filter import BeerFilter from './BeerFilter'
import Card from 'react-bootstrap/Card'
import Button from 'react-bootstrap/Button'
import {UncontrolledCollapse} from 'reactstrap'

export class AllUsers extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      showForm: false,
      stat: ''
    }
    this.handleChange = this.handleChange.bind(this)
    this.handleSubmit = this.handleSubmit.bind(this)
  }

  componentDidMount() {
    try {
      this.props.fetchInitialUsers()
      this.props.deleteUserThunk()
    } catch (error) {
      console.error(error)
    }
  }

  clickHandlerOne() {
    let hidden = this.state.showForm
    this.setState({
      showForm: !hidden
    })
  }

  handleChange(event) {
    //console.log('event.target', event.target)
    this.setState({
      [event.target.name]: event.target.value
    })
  }

  async handleSubmit(userId) {
    event.preventDefault()

    const updatedUser = {
      id: userId,
      isAdmin: this.state.stat
    }

    // console.log('UPDATE USER', updatedUser)

    await this.props.updateUserThunk(updatedUser)
    this.props.fetchInitialUsers()
  }

  render() {
    const users = this.props.users
    // console.log('PROPS', this.props)
    console.log('USERS', this.props.users)

    return (
      <div>
        {/* <div className="options">
          <select onChange={this.handleChange}>
            <option value="">Sort By...</option>
            <option value="priceHighToLow">Price (high to low)</option>
            <option value="priceLowToHigh">Price (low to high)</option>
            <option value="name">Name</option>
          </select>

          <BeerFilter />
          </div> */}

        <div className="flex-cards">
          {users.map(user => (
            <Card style={{width: '18rem'}} key={user.id}>
              {/* delete thunk */}
              <span>
                <p>
                  <Button
                    id={`delete${user.id}`}
                    variant="danger"
                    onClick={() => this.props.deleteUserThunk(user.id)}
                  >
                    X
                  </Button>
                </p>
              </span>

              <Card.Body>
                <Card.Title>User Id: {user.id}</Card.Title>
                <Card.Text>
                  <div>
                    <ul>
                      <li>
                        <div className="highlight">
                          <img src={user.imageUrl} />
                        </div>
                        <div className="details">
                          <p>Username: {user.username}</p>
                          <p>User Email: {user.email}</p>
                          <p>Admin Status: {user.isAdmin ? 'true' : 'false'}</p>
                          <p>
                            Created Date:{' '}
                            {new Intl.DateTimeFormat('en-GB', {
                              month: 'short',
                              day: '2-digit',
                              year: 'numeric'
                            }).format(new Date(user.createdAt))}
                          </p>
                          <p />
                          <Button
                            id={`user${user.id}`}
                            onClick={() => {
                              this.clickHandlerOne()
                            }}
                            variant="outline-info"
                          >
                            Admin Status Toggle
                          </Button>
                          <UncontrolledCollapse toggler={`#user${user.id}`}>
                            {/* {this.state.showForm && (
                              <UpdateUserStatus userId={user.id} />
                            )} */}
                            <form onSubmit={() => this.handleSubmit(user.id)}>
                              <div>
                                <span>
                                  <select
                                    name="stat"
                                    value={
                                      typeof user.isAdmin === 'string'
                                        ? this.state.isAdmin
                                        : user.isAdmin
                                    }
                                    onChange={this.handleChange}
                                  >
                                    <option value="true">true</option>
                                    <option value="false">false</option>
                                  </select>
                                </span>

                                <p />
                                <span>
                                  <p>
                                    {/* */}
                                    <button type="submit">Submit</button>
                                  </p>
                                </span>
                              </div>
                            </form>
                          </UncontrolledCollapse>
                        </div>
                      </li>
                    </ul>
                  </div>
                </Card.Text>
              </Card.Body>
            </Card>
          ))}
        </div>
      </div>
    )
  }
}

const mapStateToProps = state => {
  return {
    users: state.allUsers
  }
}

const mapDispatchToProps = dispatch => {
  return {
    loadSingleUser: id => dispatch(fetchSingleUser(id)),
    updateUserThunk: updatedUser => dispatch(updateUserThunk(updatedUser)),
    //getSortedBeers: (sortBy, beers) => dispatch(sortBeers(sortBy, beers)),
    fetchInitialUsers: () => dispatch(getUsers()),
    deleteUserThunk: userId => dispatch(deleteUserThunk(userId))
  }
}

export default connect(mapStateToProps, mapDispatchToProps)(AllUsers)

在我的网页中,我(并非总是但通常)必须单击两次编辑按钮才能更新我的订单状态并在我的页面上呈现。我想知道警告是否与此有关。

我做错了什么?我对这种类型的编码非常陌生,因此将不胜感激响应的特异性。

【问题讨论】:

    标签: html reactjs render descendant


    【解决方案1】:

    除了解决您的控制台错误之外,我还会进行一些更改。

    1. this绑定到clickHandlerOne
    2. 不要为了采用它们的样式而使用&lt;p&gt; 标签。示例:

      这对我来说很有意义。这是一段文字。

      <p>Username: {user.username}</p>
      

      这对我来说没有意义。我认为您需要具有特定间距样式的 &lt;button&gt;

      <span>
        <p>
          <Button
            id={`delete${user.id}`}
            variant="danger"
            onClick={() => this.props.deleteUserThunk(user.id)}
          >
            X
          </Button>
        </p>
      </span>
      

    试试这段代码,看看它是如何工作的:

    import React from "react";
    import { connect } from "react-redux";
    import { getUsers, deleteUserThunk } from "../store/allUsers";
    import { updateUserThunk, fetchSingleUser } from "../store/singleUser";
    // Status Filter import BeerFilter from './BeerFilter'
    import Card from "react-bootstrap/Card";
    import Button from "react-bootstrap/Button";
    import { UncontrolledCollapse } from "reactstrap";
    
    export class AllUsers extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          showForm: false,
          stat: ""
        };
        this.clickHandlerOne = this.clickHandlerOne.bind(this);
        this.handleChange = this.handleChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
      }
    
      componentDidMount() {
        try {
          this.props.fetchInitialUsers();
          this.props.deleteUserThunk();
        } catch (error) {
          console.error(error);
        }
      }
    
      clickHandlerOne() {
        const hidden = this.state.showForm;
        this.setState({
          showForm: !hidden
        });
      }
    
      handleChange(event) {
        //console.log('event.target', event.target)
        this.setState({
          [event.target.name]: event.target.value
        });
      }
    
      async handleSubmit(userId) {
        // event.preventDefault(); // I don't think you ave an `event` in scope here
    
        const updatedUser = {
          id: userId,
          isAdmin: this.state.stat
        };
    
        // console.log('UPDATE USER', updatedUser)
    
        await this.props.updateUserThunk(updatedUser);
        this.props.fetchInitialUsers();
      }
    
      render() {
        const users = this.props.users;
        // console.log('PROPS', this.props)
        console.log("USERS", this.props.users);
    
        return (
          <div>
            {/* <div className="options">
              <select onChange={this.handleChange}>
                <option value="">Sort By...</option>
                <option value="priceHighToLow">Price (high to low)</option>
                <option value="priceLowToHigh">Price (low to high)</option>
                <option value="name">Name</option>
              </select>
    
              <BeerFilter />
              </div> */}
    
            <div className="flex-cards">
              {users.map(user => (
                <Card style={{ width: "18rem" }} key={user.id}>
                  {/* delete thunk */}
                    <div>
                      <Button
                        id={`delete${user.id}`}
                        variant="danger"
                        onClick={() => this.props.deleteUserThunk(user.id)}
                      >
                        X
                      </Button>
                    </div>
    
                  <Card.Body>
                    <Card.Title>User Id: {user.id}</Card.Title>
                    <Card.Text>
                      <div>
                        <ul>
                          <li>
                            <div className="highlight">
                              <img src={user.imageUrl} />
                            </div>
                            <div className="details">
                              <p>Username: {user.username}</p>
                              <p>User Email: {user.email}</p>
                              <p>Admin Status: {user.isAdmin ? "true" : "false"}</p>
                              <p>
                                Created Date:{" "}
                                {new Intl.DateTimeFormat("en-GB", {
                                  month: "short",
                                  day: "2-digit",
                                  year: "numeric"
                                }).format(new Date(user.createdAt))}
                              </p>
                              <Button
                                id={`user${user.id}`}
                                onClick={() => {
                                  this.clickHandlerOne();
                                }}
                                variant="outline-info"
                              >
                                Admin Status Toggle
                              </Button>
                              <UncontrolledCollapse toggler={`#user${user.id}`}>
                                {/* {this.state.showForm && (
                                  <UpdateUserStatus userId={user.id} />
                                )} */}
                                <form onSubmit={() => this.handleSubmit(user.id)}>
                                  <div>
                                      <select
                                        name="stat"
                                        value={
                                          typeof user.isAdmin === "string"
                                            ? this.state.isAdmin
                                            : user.isAdmin
                                        }
                                        onChange={this.handleChange}
                                      >
                                        <option value="true">true</option>
                                        <option value="false">false</option>
                                      </select>
    
                                      <div>
                                        {/* */}
                                        <button type="submit">Submit</button>
                                      </div>
                                  </div>
                                </form>
                              </UncontrolledCollapse>
                            </div>
                          </li>
                        </ul>
                      </div>
                    </Card.Text>
                  </Card.Body>
                </Card>
              ))}
            </div>
          </div>
        );
      }
    }
    
    const mapStateToProps = state => {
      return {
        users: state.allUsers
      };
    };
    
    const mapDispatchToProps = dispatch => {
      return {
        loadSingleUser: id => dispatch(fetchSingleUser(id)),
        updateUserThunk: updatedUser => dispatch(updateUserThunk(updatedUser)),
        //getSortedBeers: (sortBy, beers) => dispatch(sortBeers(sortBy, beers)),
        fetchInitialUsers: () => dispatch(getUsers()),
        deleteUserThunk: userId => dispatch(deleteUserThunk(userId))
      };
    };
    
    export default connect(
      mapStateToProps,
      mapDispatchToProps
    )(AllUsers);
    

    要从&lt;p&gt; 获取您所依赖的样式,您可以inline styles,或通过className 属性使用CSS。

    还有一些 CSS-in-JS 库需要注意,例如 styled-components

    如果这能解决您的问题,请告诉我。

    【讨论】:

    • 这太棒了!非常感谢您的详细回复...现在正在运行!
    • 您似乎是这方面的专家。你介意我问你一个后续问题吗?我的 deleteUserThunk 似乎不起作用。我已经解决了几个小时,但是当我单击网页的删除按钮时,什么也没有发生。链接到 SO 问题:stackoverflow.com/questions/58049013/…
    【解决方案2】:

    &lt;Card.Text&gt; 呈现一个 &lt;p&gt; 并且你有很多 &lt;div&gt; 嵌套在那里。

    我还在handleSubmit 函数中发现了一个问题。您正在调用 event.preventDefault(),但您没有通过 event 未定义。

    【讨论】:

    • 感谢 Matthew 的回复...我不太明白您所说的 handleSubmit 部分是什么意思;你介意详细说明吗?我应该在哪里通过活动? (对不起,我对此很陌生)
    • handleSubmit 是您正在使用的函数。 event 未在该范围内定义。
    猜你喜欢
    • 2020-06-02
    • 2020-01-06
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 2017-11-16
    • 2018-09-01
    相关资源
    最近更新 更多