Добавить функцию, не добавляющую в состояние Redux - PullRequest
0 голосов
/ 05 мая 2020

Я собираюсь разместить здесь свой вопрос и, надеюсь, что-нибудь узнаю! Я следил за учебником и еще не разбирался в React и Redux, чтобы эффективно понять, что происходит. Я хочу создать функциональность, которая добавляет и удаляет предприятия в глобальное состояние в React и Redux. Из того, что я искал в Google, я знаю, что файловые структуры различаются в зависимости от проекта, поэтому я опубликую здесь все свои файлы. Я их разделил на действия. js, редукторы. js, состояние. js и хранилище. js. У меня есть добавление представления списков с помощью React, и я хотел бы добавить функцию удаления в представление списков представлений. Вот мои файлы:

redux / actions. js:

export const addListing = (newBusiness) => {
return {
    type: 'ADD_LISTING',
    value: newBusiness
}
}

export const removeListing = (index) => {
    return {
        type: 'REMOVE_LISTING',
        value: index
    }
}

redux / redurs. js:

import { combineReducers } from 'redux';
import { addBusiness, removeBusiness } from './actions'

const user = (state = null) => state

// add switch statements in here
const businesses = (state = [], action) => {
    switch(action.type) {
        case 'ADD_BUSINESS':
            return [ ...state, action.value ]
        case 'REMOVE_BUSINESS':
            const newState = [ ...state ]
            newState.splice(action.value, 1);
            return newState;
     default: // need this for default case
      return state 
    }
}

export default combineReducers({ user, businesses })

redux / state. js

export default {
    user: {
        username: 'test-user-1',
        email: 'test-user@example.com'
    },
    businesses: [
        {
            "id": 15,
           "name": "My pizza",
           "description":"Homemade pizza shop",
           "address": "123 Taco Street",
           "hours": "9-5"
        }
    ]
  };

redux / store. js

import { createStore } from 'redux'
import reducers from './reducers'
import state from './state'



export default createStore(reducers, state)

container / addListing. js

import  { connect } from "react-redux";
import { addListing } from '../redux/actions';
import AddListing from '../components/addListing'


const mapDispatchToProps = (dispatch) => {
    return {
        addListing: (business) => dispatch(addListing(business)),
    }
}

export default connect(null, mapDispatchToProps)(AddListing)

container / removeListing. js

import  { connect } from "react-redux";
import { removeListing } from '../redux/actions';

const mapDispatchToProps = (dispatch) => {
    return {
        removeCar: (business) => dispatch(removeListing(business)),
    }
}

export default connect(null, mapDispatchToProps)(removeListing)

контейнеров / Листинг. js:

import { connect } from 'react-redux'
import Listing from '../components/Listing'

const mapStateToProps = (state) => {
    return {
        businesses: state.businesses,
        user: state.user.username
    }
}

export default connect(mapStateToProps)(Listing)

компонентов / addListing. js

import React from 'react';
import { InputLabel } from '@material-ui/core'
import { Input } from '@material-ui/core'
import { FormControl } from '@material-ui/core';
import { Button } from '@material-ui/core';
import { TextField } from '@material-ui/core';
import '../redux/state';

class addListing extends React.Component {

    state = {
        name: '',
        description: '',
        address: '',
        hours: ''
    }


    handleTextChange = (e) => {
        const newState = { ...this.state }
        newState[e.target.id] = e.target.value
        this.setState(newState)
        console.log(this.state)
    }

    handleSubmit = (e) => {
        e.preventDefault()
        const payload = { ...this.state }
        console.log("THE BUSINESS", payload)
        this.props.addListing(payload)
        console.log(this.props)
    }

    componentDidUpdate = (prevProps, prevState) => {
        if (prevState.open !== this.state.open) {
            this.setState({
                name: '',
                description: '',
                address: '',
                hours: ''
            })
        }
    }

    render(){
        return (
            <div className="App">
                <form 
                                onSubmit={this.handleSubmit}
                                style={{ display: 'flex', flexDirection: 'column', width: '350px' }}>
                                <TextField 
                                    id="name" 
                                    name="name"
                                    placeholder="Name" 
                                    value={this.state.name} 
                                    onChange={this.handleTextChange} 
                                    required />
                                <TextField 
                                    id="description" 
                                    name="description"
                                    placeholder="Description" 
                                    value={this.state.description} 
                                    onChange={this.handleTextChange} 
                                    required />
                                <TextField 
                                    id="address" 
                                    name="address"
                                    placeholder="Address" 
                                    value={this.state.address} 
                                    onChange={this.handleTextChange} 
                                    required />
                                <TextField 
                                    id="hours" 
                                    name="hours"
                                    placeholder="Hours" 
                                    value={this.state.hours} 
                                    onChange={this.handleTextChange} 
                                    required />
                                <br />
                                <Button variant="contained" color="primary" type="submit">Submit</Button>
                            </form>
            </div>
          );
    }

}

export default addListing;

компонентов / Листинга. js:

import React from 'react'
import {
    Container,
    Table,
    TableBody,
    TableCell,
    TableHead,
    TableRow
} from '@material-ui/core'
import DeleteIcon from '@material-ui/icons/Delete'
import addListing from '../containers/addListing'
import removeListing from '../containers/removeListing'
import businesses from '../redux/state'
import user from '../redux/state';


const Listing = (props) => {
    console.log(props.businesses)
    return (
        <Container maxWidth="lg" className="car-container">
            <h4>Welcome, {props.user.username}</h4>
            <div className="flex-container">
            </div>
            <Table>
                <TableHead>
                    <TableRow>
                        <TableCell>ID</TableCell>
                        <TableCell>Name</TableCell>
                        <TableCell>Description</TableCell>
                        <TableCell>Address</TableCell>
                        <TableCell>Hours</TableCell>
                    </TableRow>
                </TableHead>
                <TableBody>
                {props.businesses.map((businesses, idx) => (
                    <TableRow key={businesses.id}>
                        <TableCell component="th" scope="row">

                        </TableCell>
                        <TableCell>{businesses["name"]}</TableCell>
                        <TableCell>{businesses["description"]}</TableCell>
                        <TableCell>{businesses["address"]}</TableCell>
                        <TableCell>{businesses["hours"]}</TableCell>
                        <TableCell>
                            <DeleteIcon
                                // add onClick method here

                                // onClick={props.removeCar(idx)}
                                className="icon text-red" 
                                onClick={ () => this.props.removeListing(idx)}
                                />
                        </TableCell>
                    </TableRow>
                ))}
                </TableBody>
            </Table>
        </Container>
    )
}

export default Listing

Приложение. js:

import React from 'react';
import Navigation from './components/Navigation'
import './App.css'
import Router from './Router'
import { BrowserRouter } from 'react-router-dom'
import { Provider } from 'react-redux'
import store from './redux/store'

function App() {
  return (
    <Provider store={store}>
      <BrowserRouter>
        <Navigation />
        <Router />
      </BrowserRouter>
    </Provider>
  );
}

export default App;

index. js:

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import Login from './components/Login'
import App from './App';
import * as serviceWorker from './serviceWorker';
import Listing from '../src/components/Listing';
import { Provider } from 'react-redux';

ReactDOM.render(

        <App />,

  document.getElementById('root')
);

// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.

serviceWorker.unregister();

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

1 Ответ

0 голосов
/ 05 мая 2020

Я вижу, что названия ваших действий разные ADD_LISTING vs ADD_BUSINESS, REMOVE_LISTING vs. REMOVE_BUSINESS.

В addListing у вас есть {type: 'ADD_LISTING', ...} в вашем редукторе у вас case 'ADD_BUSINESS': Струны разные. Они должны совпадать. Попробуйте переименовать ADD_BUSINESS => ADD_LISTING и REMOVE_BUSINESS => REMOVE_LISTING.

Что касается cra sh в строке 50. this. вам не нужно, потому что ваш компонент не тип class. Измените его на onClick={ () => props.removeListing(idx)}.

Вам не хватает removeListing в mapDispatchToProps.

Кроме того, плагин Redux DevTools для Chrome может очень помочь вам в устранении проблем с сокращение ..

...