HTML JavaScript React: создание компонента переднего плана Reactact-dom.development.js: 506 Предупреждение - PullRequest
0 голосов
/ 22 сентября 2019

Я рендерил внешний компонент реагирования / редукции с использованием синтаксиса JSX.Он запускается, но выдает следующее предупреждение в моей консоли:

enter image description here

Ниже мой код:

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)

На моей веб-страницеМне (не всегда, но обычно) приходится дважды нажимать кнопку редактирования, чтобы обновить статус своего заказа и отобразить его на моей странице.Мне интересно, связано ли предупреждение с этим.

enter image description here

Что я делаю не так?Я очень новичок в этом типе кодирования, поэтому была бы очень признательна за специфичность ответов.

Ответы [ 2 ]

2 голосов
/ 22 сентября 2019

Есть несколько изменений, которые я хотел бы внести, помимо исправления ошибки вашей консоли.

  1. Привязать this к clickHandlerOne
  2. Не использовать<p> тегов ради принятия их стиля.Пример:

    Это имеет смысл для меня.Это абзац текста.

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

    Это не имеет смысла для меня.Я думаю, что вам нужен <button> с определенными стилями пробелов:

    <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);

Дляполучить стили, на которые вы полагались, из <p>, вы можете встроенные стили или использовать CSS с помощью className prop.

Также естьнесколько библиотек CSS-in-JS, о которых нужно знать, таких как styled-components .

Дайте мне знать, если это решит вашу проблему.

0 голосов
/ 22 сентября 2019

<Card.Text> отображает <p>, и у вас есть множество вложенных <div>.

Я также обнаружил проблему в функции handleSubmit.Вы звоните event.preventDefault(), но не набираете event не определено.

...