Сохранение и редактирование поста в reactjs и редуксе - PullRequest
0 голосов
/ 28 марта 2020

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

Я создал codesandbox сайта. Я не уверен, почему все строки в выражениях switch в файле редуктора подчеркнуты красным.

Это мой домашний файл. js, в который загружаются фрагменты

import React from "react";
import axios from "axios";
import { Link } from "react-router-dom";
import { onLoad, setEdit } from "./actions/posts";
import { connect } from "react-redux";

class Home extends React.Component {
  constructor(props) {
    super(props);
  }

  componentDidMount() {
    //Load all the snippets
    onLoad();
  }

  render() {
    const { snippets } = this.props;

    return (
      <div className="container">
        <div className="row pt-5">
          <div className="col-12 col-lg-6 offset-lg-3">
            <h1 className="text-center">Snippets</h1>
          </div>
        </div>
        <div className="row pt-5">
          <div className="col-12 col-lg-6 offset-lg-3">
            {snippets.map(snippet => {
              return (
                <div className="card my-3" key={snippet.snippetData.snippetId}>
                  <div className="card-header">{snippet.title}</div>
                  <div className="card-body">{snippet.snippetDescription}</div>
                  <div className="card-footer">
                    <div className="row">
                      <button
                        // onClick={() => this.handleEdit(snippet)}
                        className="btn btn-primary mx-3"
                      >
                        <Link to={`/editor/:${snippet.snippetData.snippetId}`}>
                          Edit
                        </Link>
                      </button>
                    </div>
                  </div>
                </div>
              );
            })}
          </div>
        </div>
      </div>
    );
  }
}

const mapStateToProps = state => ({
  snippets: state.snippets,
  snippetData: state.snippetData
});

export default connect(
  mapStateToProps,
  { onLoad, setEdit }
)(Home);

редактор. js страница

import React, { Component } from "react";
import { connect } from "react-redux";
import { savePost, retrievePost } from "./actions/posts";

class Editor extends Component {
  state = {
    title: "",
    enteredText: ""
  };
  componentDidMount() {
    //Load the snippet
    retrievePost(); // will it load the snippetId too?
  }

  handleChange = event => {
    const { value } = event.target;
    this.setState({
      enteredText: value
    });
  };

  // Save Snippet
  performSave = snippetData => {
    const { enteredText, title } = this.state;
    savePost(snippetData.snippetId, enteredText, title); //is it the right way to send the parameters to save the post??
  };

  render() {
    return (
      <>
        <input
          type="text"
          id="titletext"
          placeholder="Enter title here"
          limit-to="64"
          className="inptxt"
          onChange={title => this.setState({ title })}
        />
        <button
          className="btn savebtn"
          onClick={() => this.handlePost({ ...this.state })}
        >
          Save Snippet
          <i className="fas fa-save" />
        </button>

        <div
          contentEditable={true}
          spellCheck="false"
          name="enteredText"
          placeholder="Enter your text here"
          onChange={this.handleChange}
        />
      </>
    );
  }
}

const mapStateToProps = state => ({
  snippetData: state.snippetData
});

export default connect(
  mapStateToProps,
  { savePost, retrievePost }
)(Editor);

действия. js файл

import { SAVE_POST, UPDATE_POST, RETRIEVE_POST, HOME_LOADED } from "./types";

export const savePost = ({
  snippetId,
  snippetDescription,
  snippetTitle
}) => async dispatch => {
  const config = {
    headers: {
      "Content-Type": "application/json"
    }
  };
  let snippetData = { snippetId, snippetDescription, snippetTitle };
  try {
    if (snippetId == null) {
      const res = await axios.post(
        "/api/save",
        JSON.stringify(snippetData),
        config
      );
      snippetData.snippetId = res.data;
      dispatch({
        type: SAVE_POST,
        payload: snippetData
      });
    } else {
      const res = await axios.post(
        "/api/update",
        JSON.stringify(snippetData),
        config
      );
      dispatch({
        type: UPDATE_POST,
        payload: snippetData
      });
    }
  } catch (err) {
    console.log(err);
  }
};

// Retrieve post

export const retrievePost = snippetId => async dispatch => {
  try {
    const res = await axios.post(`/api/snippetdata/${id}`);
    dispatch({
      type: RETRIEVE_POST,
      payload: res.data
    });
  } catch (err) {
    console.error(err);
  }
};

//Retrieve all the post
export const onLoad = () => async dispatch => {
  try {
    const res = await axios.post(`/api/mysnippets/`);
    dispatch({
      type: HOME_LOADED,
      payload: res.data
    });
  } catch (err) {
    console.error(err);
  }
};

// edit a post

1 Ответ

1 голос
/ 28 марта 2020

Во-первых, я исправил некоторые проблемы для вас:

https://codesandbox.io/s/amazing-bird-dd2mb

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

Я предлагаю вам прекратить играть сейчас, у вас недостаточно опыта, чтобы использовать сложные фреймворки.

В чем проблема вашего кода:

  1. Неправильный импорт общего JS модуля
  2. Злоупотребление combineReducers
  3. Злоупотребление html элемент формы
  4. Злоупотребление js switch
  5. Не правильно понимать состояние притока
  6. Не полностью понимать редуктор
  7. Не иметь базовых c навыков отладки ...

ПРЕКРАТИТЕ ПИСЬМЕННЫЙ КОД, КОТОРЫЙ ВЫ НЕ ПОНИМАЕТЕ

Этот проект слишком сложен для начинающего.

Я предлагаю вам:

  1. Включить счетчик в vanilla js
  2. Реализация списка задач в vanilla js
  3. Повторно внедрить счетчик с чистой реакцией, без избыточности, без eact-router
  4. Повторно внедрить счетчик с response + redux
  5. Повторно внедрить счетчик с response + redux + thunk
  6. Повторно внедрить счетчик с response + redux + saga

Повторите 3-6, но список задач.

Затем попробуйте закодировать блог.

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