【问题标题】:Text editor value disappears in React Js文本编辑器值在 React Js 中消失
【发布时间】:2020-09-01 10:24:13
【问题描述】:

我正在制作一个简单的手风琴,每个手风琴内部都有一个文本编辑器。

Accordion.js

<div className="wrapper">
  {accordionData.map((item, index) => (
    <Accordion>
      <Heading>
        <div
          style={{ padding: "10px", cursor: "pointer" }}
          className="heading"
          onClick={() => toggleHandler(index)}
        >
          {toggleValue !== index ? `Expand` : `Shrink`}
        </div>
      </Heading>
      <Text>  {toggleValue === index && item.content && <EditorContainer />} </Text>
    </Accordion>
  ))}
</div>

这里的手风琴是作为一个组件组成的。这行{toggleValue === index &amp;&amp; item.content &amp;&amp; &lt;EditorContainer /&gt;} 用于检查点击的手风琴,然后相应地加载内容和文本编辑器。

完整的工作示例:

https://codesandbox.io/s/react-accordion-forked-dcqbo

步骤重现问题:

->打开上面的链接

-> 会有三个手风琴

-> 点击任何一个手风琴,这会将文本从 Expand 更改为 Shrink

-> 现在在编辑器中填充一些随机文本,然后点击文本Shrink

-> 点击展开

再次打开同一个手风琴

-> 现在已经输入的值丢失了

我怀疑它是否会发生,因为每次我们展开/收缩时,都会调用 text_editor.js 组件并且它的状态值类似于,

this.state = {
  editorState: EditorState.createEmpty()
};

这里不是EditorState.createEmpty(),我还需要提供其他东西吗?

要求:

如何在文本编辑器中存储已经输入的值。即使用户点击展开/缩小,输入的文本也需要保留在编辑器中。

非常感谢任何帮助。

【问题讨论】:

  • 你写的代码不错。看起来像当您扩展/收缩组件重新呈现的代码时。你需要保持文字写在状态。
  • @SachinVishwakarma,您能否提供一个可行的示例作为解决方案?谢谢..

标签: javascript html reactjs editor accordion


【解决方案1】:

您是对的,输入的值丢失了,因为您在 EditorContainer 组件收缩时卸载它 - 当您再次展开它时,它会创建一个新的 editorState,它是空的。

我能想到的 2 个可能的解决方案。

  1. editorStateonEditorStateChange 移动到父组件并将其传递给EditorContainer。这样,当我们卸载 EditorContainer 时,我们不会丢失之前的 editorState,因为它在 Parent 上。

  2. 我们将EditorContainer 包裹在div 中,当我们在收缩/展开之间切换时,我们将应用display 样式。这样,我们只隐藏了 EditorContainer 而不是卸载它,所以它的 states 将保留。

我会选择实施第二种解决方案,因为我们只需要更改我们的Accordion.js 文件。无论哪种方式,我都会创建一个新组件来处理当前项目。我称之为NormalAccordionItem

const NormalAccordionItem = ({ data }) => {
  const [show, setShow] = useState(false);

  function toggle() {
    setShow((prev) => !prev);
  }

  return (
    <Accordion>
      <Heading>
        <div
          style={{ padding: "10px", cursor: "pointer" }}
          className="heading"
          onClick={toggle}
        >
          {show ? "Shrink" : "Expand"}
        </div>
      </Heading>
      <Text>
        <div style={{ display: show ? "block" : "none" }}> // notice this
          <EditorContainer />
        </div>
      </Text>
    </Accordion>
  );
};

然后在我们的NormalAccordion 上,我们将使用NormalAccordionItem

const NormalAccordion = () => {
  return (
    <div className="wrapper">
      {accordionData.map((data) => (
        <NormalAccordionItem data={data} key={data.id} />
      ))}
    </div>
  );
};

就是这样,查看下面的演示。

编辑更新了演示,一次扩展一个NormalAccordionItem

【讨论】:

  • 一次又一次,我只能表示非常感谢兄弟..你太棒了..
  • 你好兄弟,很抱歉再次打扰你..我需要你的大力帮助..请看看这个代码框codesandbox.io/s/next-dynamic-testing-issue-forked-8i8kh..这里我需要包含文本编辑器和其他输入(公司名称,名称,开始日期和结束日期以及详细信息(文本编辑器))..我面临一些属性未定义的问题..请谦虚地帮助我..
  • 你以这种情况而闻名,因此我正在寻求你的帮助..请帮帮我兄弟,我对所有事情都感到困惑..
  • 要求是我需要为展开/折叠内的每个部分制作输入控件。以前我们没有展开/折叠但现在它需要展开/折叠,因此我面临很多一一问题..所以考虑我的要求并帮助我兄弟..如果需要,我可以为您提供更多详细信息..
  • 您在NormalAccordionItem 中访问inputField,但您从EmploymentDetails 传递了data={inputField}。你应该使用data.companyName?
猜你喜欢
  • 2020-10-03
  • 2020-12-20
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多