JavaScript React Redux: невозможно удалить элемент на веб-странице без предварительного обновления - PullRequest
0 голосов
/ 22 сентября 2019

У меня есть текущая веб-страница ниже и я хочу удалить пользователя, когда я нажимаю на красную кнопку «х» в верхней части карты.

В настоящее время после нажатия кнопки «x» ничего не происходит.После обновления страницы пользователь будет удален с моей веб-страницы.Но я хочу, чтобы это произошло без обновления вообще.

Пример веб-страницы:

enter image description here

Внутренний маршрут:

enter image description here

Чтобы добиться этого, я попробовал следующее:

Настройка внутреннего маршрута:

    const router = require('express').Router()
    const {User} = require('../db/models')
    module.exports = router
    const {isUser, isAdmin} = require('../checks')
    // 8080/api/users/:userId

    router.delete('/:userId', isAdmin, async (req, res, next) => {
      let userId = req.params.userId

      try {
        await User.destroy({
          where: {
            id: userId
          }
        })
        res.status(204)
      } catch (err) {
        next(err)
      }
    })

Настройка резервного хранилищаи thunk:

    import axios from 'axios'

    // ACTION TYPES

    const SET_USERS = 'SET_USERS'
    const DELETE_USER = 'DELETE_USER'

    // ACTION CREATORS

    export const setUsers = users => ({
      type: SET_USERS,
      users: users
    })

    export const deleteUser = delUserId => ({
      type: DELETE_USER,
      delUserId: delUserId
    })

    // DOLLAR HELPER FOR CENTS FIELD

    // export const toDollars = cents => {
    //   return `$${(cents / 100).toFixed(2)}`
    // }

    // THUNK CREATORS

    export const getUsers = () => async dispatch => {
      try {
        const {data} = await axios.get('/api/users')
        dispatch(setUsers(data))
        console.log('getUsersThunk DATA ARRAY', data)
      } catch (err) {
        console.error(err)
      }
    }

    export const deleteUserThunk = delUserId => async dispatch => {
      try {
        const response = await axios.delete(`/api/users/${delUserId}`)
        const deleteUserId = response.data

        dispatch(deleteUser(deleteUserId))
        console.log('getUsersThunk DELETE', deleteUserId)
      } catch (err) {
        console.error(err)
      }
    }

    // REDUCER

    // INITIAL STATE

    const allUsers = []

    export default function(state = allUsers, action) {
      switch (action.type) {
        case SET_USERS:
          return action.users
        case DELETE_USER: {
          let userRemovalArray = state.filter(user => user.id !== action.delUserId)
          return userRemovalArray
        }
        default:
          return state
      }
    }

Создание внешнего компонента, который вызывает 'deleteUserThunk'

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()
    } 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 */}
              <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>
                          <p />
                          <Button
                            id={`user${user.id}`}
                            onClick={() => {
                              this.clickHandlerOne()
                            }}
                            variant="outline-info"
                          >
                            Admin Status Toggle
                          </Button>
                          <UncontrolledCollapse toggler={`#user${user.id}`}>
                            <form onSubmit={() => this.handleSubmit(user.id)}>
                              <div>
                                <span>
                                  <select
                                    name="stat"
                                    value={this.state.isAdmin}
                                    onChange={this.handleChange}
                                  >
                                    <option value="">user isAdmin?</option>
                                    <option value="true">true</option>
                                    <option value="false">false</option>
                                  </select>
                                </span>

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

С моим кодом выше, когда я нажимаю наКрасная кнопка «х» ничего не происходит.Я должен нажать кнопку обновления, чтобы мой теперь удаленный пользователь был удален с моей веб-страницы.

Как я могу удалить пользователя из моего текущего представления, не нажимая кнопку обновления?

Ответы [ 2 ]

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

Здесь, так как вы используете mapDispatchToProps в вашем компоненте "AllUsers"

ваш deleteUserThunk (в THUNK CREATORS) назначен deleteUserThunk (в вашем компоненте "AllUsers")

, следовательно, вынеобходимо вызвать функцию THUNK CREATEORS, вызвав функцию компонента, которая назначена в mapDispatchToProps

Вы должны вызвать ее следующим образом

onClick = {() => this.props.deleteUserThunk(user.id)}

Это передаст ваш user.id в deleteUserThunk (в вашем компоненте «AllUsers») в deleteUserThunk (в THUNK CREATORS)

Согласно вашим комментариям. Во-первых,Вы должны удалить его из componentDidMount (), потому что вам не следует запускать функцию удаления при монтировании компонента.

Во-вторых, если ваш редуктор обновлен, то ваш браузер будет обновляться без какого-либо обновления.Попробуйте проверить параметры, которые передаются в DELETE_USER

. Мой совет: в вашей функции deleteUserThunk (в THUNK CREATORS) замените dispatch (deleteUser (deleteUserId)) на dispatch (deleteUser (delUserId))

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

Это не полный ответ, но здесь определенно есть проблема:

const response = await axios.delete(`/api/users/${delUserId}`)

Если вы посмотрите на предоставленный вами скриншот ошибки в веб-консоли, этопоказывая undefined, где delUserId должно быть.Таким образом, где-то вдоль линии между щелчком «X» и строкой выше, вы неправильно передаете идентификатор пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...