• Как плавно скрыть элемент и после убрать его из дом дерева?

    Seanyr
    @Seanyr
    Средствами css убрать из дом нельзя.
    Можно скрыть из потока, но все связанные с этим свойства не анимируются.
    А можно, например, сделать чтобы он не занимал места в потоке или придумать еще какие-нибудь костыли:
    Ответ написан
    Комментировать
  • Расставить элементы в списке?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Object.values(arr.reduce((acc, row) => {
      row.forEach((n, i, a) => i && (acc[n] = acc[n] || [n]).push(a[0]));
      return acc;
    }, {}))
    Ответ написан
    Комментировать
  • React-redux не перерисовывается компонент при изменении state?

    Devilz_1
    @Devilz_1
    Frontend-Developer
    Ваша логика здесь такая:

    Производя ввод каких-то символов, вызывается функция filterUsers, которая в свою очередь диспатчит вводимое значение в store, заменяя каждый раз параметр search. Каждый раз, когда вызывается dispatch происходит перерендер того состояния, который меняется в зависимости от диспатча. В вашем примере, вы обновляете состояние параметра search, когда параметр users сохраняет своё состояние с того момента, когда вы последний раз диспатчили его (т.е. вызывали функцию loadUsers), потому, что функция filterUsers ссылается на кейс USERTABLE_FILTER_USERS, а к кейсу, который меняет непосредственно состояние параметра users (USERSTABLE_LOAD_USERS) он не обращается.

    Попробуйте так. Решение конечно не идеально, но Вы должны увидить разницу. Замените свой кейс USERTABLE_FILTER_USERS, на тот, что внизу.

    case USERTABLE_FILTER_USERS:
                    return {
                        ...state,
                        search: action.payload,
                        users: filteredUsers(state.users)
                    }
    Ответ написан
    Комментировать
  • React-redux не перерисовывается компонент при изменении state?

    @camelCaseVlad
    Посмотрел на вашу репу:

    Вот что сделал я.

    Во первых, вы не настроили store и редукс дев-тулз.

    Я сделал это в вашем индексе, однако рекомендую вынести данный функционал в отдельный файл (установите недостающие пакеты):

    // src/index.js
    
    import React from 'react';
    import ReactDOM from 'react-dom';
    import App from './App';
    import * as serviceWorker from './serviceWorker';
    import { applyMiddleware, compose, createStore } from 'redux';
    import { createLogger } from 'redux-logger';
    import rootReducer from "./store/reducers";
    import { Provider } from "react-redux"
    import {BrowserRouter} from "react-router-dom";
    
    function configureStore(initialState) {
      const windowExist = typeof window === 'object';
      const loggerMiddleware = createLogger({
        colors: {
          title: (color) => windowExist && color,
          prevState: (color) => windowExist && color,
          action: (color) => windowExist && color,
          nextState: (color) => windowExist && color,
          error: (color) => windowExist && color
        }
      });
      const composeEnhancers = (windowExist &&
        window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) || // eslint-disable-line no-underscore-dangle
        compose;
      return createStore(
        rootReducer,
        initialState,
        composeEnhancers(
          applyMiddleware(loggerMiddleware),
        )
      );
    }
    
    
    
    const application = (
        <BrowserRouter>
            <Provider store={configureStore()}>
                <App/>
            </Provider>
        </BrowserRouter>
    )
    
    ReactDOM.render( application , 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.
    // Learn more about service workers: https://bit.ly/CRA-PWA
    serviceWorker.unregister();


    Функционал filteredUsers в папке reducers не нужен. У вас уже есть массив с юзерами, можете работать с ним в компоненте напрямую.

    // src/store/UsersTable/reducers.js
    
    import {
        USERSTABLE_LOAD_USERS,
        USERTABLE_FILTER_USERS
    } from "./actions";
    
    const defaultState = {
        users: [],
        isLoading: true,
        search: '',
    }
    
    
    
    export const userstableReducer = (state = defaultState, action) => {
            switch(action.type) {
                case USERSTABLE_LOAD_USERS:
                    return {
                        ...state,
                        users: action.payload,
                        isLoading: false
                    }
                case USERTABLE_FILTER_USERS:
                    return {
                        ...state,
                        search: action.payload
                    }
                default: return state
            }
    
    }


    Теперь к вопросу.

    У вас уже есть массив, поработав напрямую с котором можно отражать нужные ячейки
    import React from "react"
    import "./userstable.css"
    
    export default class UsersTable extends React.Component {
        render() {
            const { users, filterUsers, searchValue } = this.props
            const filteredUsers = users && users.filter(user => {
                const fullName = `${user.name} ${user.surname}`;
                return fullName.toLowerCase().indexOf(searchValue.toLowerCase()) !== -1;
            });
            return (
                <React.Fragment>
                    <input
                        onChange={event => filterUsers(event.target.value)}
                    />
                        <table>
                            <thead>
                                <tr>
                                    <th>Имя</th>
                                    <th>Фамилия</th>
                                    <th>Город</th>
                                    <th>IP</th>
                                </tr>
                            </thead>
                            {<b>filteredUsers</b>.map(user => {
                                return (
                                    <tbody key={user.id}>
                                    <tr>
                                        <td> {user.name}</td>
                                        <td> {user.surname}</td>
                                        <td> {user.city}</td>
                                        <td> {user.lastloginfromip}</td>
                                    </tr>
                                    </tbody>
    
                                )
                            })}
                        </table>
                </React.Fragment>
            )
        }
    }

    5dfa91f33fd2a343028976.png
    Ответ написан
    2 комментария
  • React-Redux загрузка данных с сервера?

    Devilz_1
    @Devilz_1
    Frontend-Developer
    import React, {Fragment} from "react"
    import { connect } from "react-redux"
    import UsersTable from "./UsersTable";
    import { loadUsers } from "../../store/UsersTable/actions";
    
    
    class UsersTableContainer extends React.Component {
    
        async componentDidMount() {
            const response = await fetch("http://www.filltext.com/?rows=500&id={index}&name={firstName}&surname={lastName}&city={city}&fullname={firstName}~{lastName}&lastloginfromip={ip}")
            const data = await response.json()
            this.props.loadUsers(data)
        }
    
        render() {
            const { users, loadUsers } = this.props
            return (
                 <Fragment>
                       {!isLoading ? (
                            <React.Fragment>
                                <UsersTable
                                    users={users}
                                    loadUsers={loadUsers}
                                />
                            </React.Fragment>
                       ) : (
                          <Preloader>
                       )}
                 </Fragment>
            )
        }
    }
    
    const setStateToProps = state => {
        return {
            users: state.userstable.users,
            isLoading: state.userstable.isLoading
        }
    }
    
    const setDispatchToProps = {
        loadUsers
    }
    
    export default connect(setStateToProps, setDispatchToProps)(UsersTableContainer)


    Попробуйте так. Вместо компоненты < Preloader > подсуньте свою "крутилку".
    Ответ написан
    2 комментария
  • Литература по NodeJS?

    0xD34F
    @0xD34F
    служу в армии

    Какую литературу посоветуете?

    Устав гарнизонной и караульной службы.

    Без практики в чтении книжек смысла нет. Как вы собираетесь практиковаться в армии - представить затрудняюсь.
    Ответ написан
    Комментировать