【问题标题】:How to update Draft Value when click of Save Button?单击保存按钮时如何更新草稿值?
【发布时间】:2021-04-14 13:12:39
【问题描述】:

我有两个输入表单和一个段落,当我尝试更改输入的值时,段落会更新,一旦段落更新,我会尝试在草稿库的帮助下编辑段落,但是一旦我更新段落并保存它,它不会更新段落。

请任何人帮我解决问题

代码沙盒链接:Code

上下文 API

import React, { useState, createContext } from "react";

export const Contx = createContext();

export const ConProvider = ({ children }) => {
  const [customerName, setCustomerName] = useState("");
  const [amount, setAmount] = useState("");

  const defaultValue = `<p>Hello ${
    customerName === "" ? "User" : customerName
  },</p>
<p>Please Click on the link below to pay the order - <strong>${amount}</strong> . </p>
<p>Click hear to pay</p>
<br/>
<p>Thanks and Regards</p>
<p>testUser</p>`;
  const [draftValue, setDraftValue] = useState(defaultValue);
  return (
    <Contx.Provider
      value={{
        defaultValue,
        setCustomerName,
        setAmount,
        customerName,
        amount,
        setDraftValue,
        draftValue
      }}
    >
      {children}
    </Contx.Provider>
  );
};

主页

import React, { useContext, useState } from "react";
import ReactDOM from "react-dom";
import { ConProvider, Contx } from "../ContextApi";
import Data from "./Component/Data/Data";
import NewDraft from "./Component/Data/NewDraft";
import Modal from "./Component/Data/Modal";

import "./styles.css";

function App() {
  const { defaultValue, setDraftValue, draftValue } = useContext(Contx);
  // console.log("defaultValue", defaultValue);
  const [show, setShow] = useState(false);

  const handleClose = () => setShow(false);
  const handleShow = () => setShow(true);
  return (
    <div className="App">
      <Data />
      <Modal handleClose={handleClose} show={show}>
        <NewDraft
          prsFunc={setDraftValue}
          handleClose={handleClose}
          defaultValueEmpty={false}
          defaultValue={defaultValue}
        />
      </Modal>

      <div
        className="templateStyle p-2"
        // eslint-disable-next-line react/no-danger
        dangerouslySetInnerHTML={{
          __html: draftValue && draftValue
        }}
      />
      <button onClick={handleShow}>Edit</button>
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(
  <ConProvider>
    <App />
  </ConProvider>,
  rootElement
);

输入表格

import React, { useContext } from "react";
import { Contx } from "../../../ContextApi";

export default function Data() {
  const {
    setCustomerName,
    setDraftValue,
    defaultValue,
    setAmount,
    customerName,
    amount
  } = useContext(Contx);
  React.useEffect(() => {
    setDraftValue(defaultValue);
  });
  // console.log("fffffff", customerName, amount);
  return (
    <div>
      <input
        type="text"
        value={customerName}
        name="customerName"
        placeholder="Enter Customer name"
        onChange={(e) => {
          setCustomerName(e.target.value);
        }}
      />
      <input
        type="number"
        placeholder="Enter Amount"
        value={amount}
        onChange={(e) => setAmount(e.target.value)}
      />
    </div>
  );
}

DraftJS

import React, { useState } from "react";
import { Editor } from "react-draft-wysiwyg";
import {
  EditorState,
  convertToRaw,
  ContentState,
  convertFromHTML
} from "draft-js";
import "react-draft-wysiwyg/dist/react-draft-wysiwyg.css";
import draftToHtml from "draftjs-to-html";
import "./Data.css";

export default function NewDraft({
  handleClose,
  defaultValue,
  defaultValueEmpty,
  prsFunc
}) {
  const initialState = defaultValueEmpty
    ? () => EditorState.createEmpty()
    : EditorState.createWithContent(
        ContentState.createFromBlockArray(convertFromHTML(defaultValue))
      );
  const [editorState, setEditorState] = useState(initialState);

  const onChange = (value) => {
    setEditorState(value);
  };

  const saveData = () => {
    prsFunc(draftToHtml(convertToRaw(editorState.getCurrentContent())));
    handleClose();
  };

  // console.log(draftToHtml(convertToRaw(editorState.getCurrentContent())));

  return (
    <div>
      <div style={{ border: "2px solid", padding: "20px" }}>
        <Editor
          editorState={editorState}
          toolbarClassName="toolbarClassName"
          wrapperClassName="wrapperClassName"
          editorClassName="editorClassName"
          onEditorStateChange={(value) => onChange(value)}
        />
        <button variant="secondary" onClick={saveData}>
          Save
        </button>
      </div>
    </div>
  );
}

【问题讨论】:

    标签: reactjs react-hooks draftjs react-draft-wysiwyg


    【解决方案1】:

    您面临的问题是由Data 组件中的这一行引起的。每次更新组件时,draftValue 都会设置为defaultValue

      React.useEffect(() => {
         setDraftValue(defaultValue);
      });
    

    【讨论】:

    • 是的,如何解决。你能帮帮我吗?我已经通过了,但现在输入表单时实时更改不起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 2011-11-04
    相关资源
    最近更新 更多