【问题标题】:How to allow user to edit a section of a website in React?如何允许用户在 React 中编辑网站的一部分?
【发布时间】:2021-04-20 01:41:55
【问题描述】:

我是 Web 开发的新手,我似乎找不到太多关于这方面的信息。

所以我和我的项目组正在使用 React 构建一个电子商务网站。到目前为止,有“客户用户”和一些“管理员用户”。该网站是一个单一的应用程序,不同的用户类型(客户和管理员)将由私有路由分隔,因此它们每个都有只有该用户类型可以访问的页面。

我将有一个名为“条款和条件”的页面,其中将包含一大段包含公司条款和条件的文本。我希望管理员用户能够从另一个页面(组件)编辑该页面(组件)中的文本。

为此,我需要将该可编辑文本作为字符串存储在数据库中并在那里进行编辑,还是有办法将其存储在应用程序中?将其存储在应用程序中是首选。

长话短说,我希望管理员用户能够编辑网站内的文本部分,并且客户用户能够看到编辑结果。

【问题讨论】:

  • 你不能只在前端做事,并期望在别人的设备上改变它。其他人的计算机如何知道管理员在他们的计算机上做了什么?如果它没有存储在后端,则不会在不同的前端设备之间共享。因此,将 T&C 存储在数据库中,然后在管理员更改它们时更新它们。
  • 查看内容管理系统或 CMS。我听说幽灵应该很好

标签: javascript reactjs database mongodb web


【解决方案1】:

您需要可编辑的资源需要存储在某个地方。无论是数据库还是您正在阅读的 Markdown 文件 - 这取决于您。

然后,一旦您存储了该信息,您就可以从您的前端应用程序中请求它。用户将能够导航到请求并显示该资源的页面。

在您的管理界面中,您还可以创建一个视图,在该视图中加载您要编辑的内容,然后将修改后的内容发送回最初存储的位置。

也就是说,您可以写入文件或向后端发送一个 POST 请求,后端会将其写入您的数据库,这样当用户再次请求它时,它将包含更新、编辑的信息。

同样的原则也可以应用于其他类型的资源 - 例如。对于结构化数据,您可以使用一个简单的 JSON 文件,您可以读取然后写入或使用数据库。

根据您的问题,您很可能刚刚开始,尤其是后端方面,您可能想要研究像 Firebase 这样的解决方案,您可以在其中以相当简单的方式直接从前端代码使用和操作数据。

【讨论】:

  • 我的项目组已经有一个用 Mongodb 排序的后端,我正在做前端。对我来说,只使用数据库有意义吗?
  • @Tom 如果已经有一个带有数据库的后端,你需要让后端人员给你可以通信的端点。您需要一个端点来响应您可用于检索该数据的GET 请求,以及另一个响应您可用于更新数据的PUT(或PATCH)请求。在大多数情况下,如果您正在构建管理界面,您可能需要为每个资源提供一整套 CRUD 端点。
【解决方案2】:

我在一个套牌构建网站上这样做。您可以选择两个选项,这取决于您是否要使用 Redux。

无论你选择哪个方向,解决方案都是相似的。唯一改变的是逻辑在哪里。使用 redux,它将在减速器中。没有它,逻辑将在您的组件中。我个人喜欢使用 redux,因为如果您的 UI 发生变化,您不必再纠结以使您的网站再次运行,并且由于 useSelector 钩子可用于轻松提取父组件和子组件中的 redux 值,它可以将组件与子组件分离不会污染您的道具或构建上下文提供程序。

您将需要一个点击离开的侦听器组件,例如 https://www.npmjs.com/package/react-click-away-listener

没有redux:

import * as React from 'react'
import ClickAwayListener from 'react-click-away-listener'

const MyComponent = (props) => {
  const [isEditingField, setIsEditingField] = React.useState(false)
  const [value, setValue] = React.useState('')

  const handleClick = (event) => {
    setIsEditingField(true)
  }

  const handleClickAway = (event) => {
    setIsEditingField(false)
  }

  return <div>
    {editing && <ClickAwayListener>
      <input
        type="text"
        onChange={setValue}
        onClick={handleOnClick}
      />
    </ClickAwayListener>
  </div>}

  {!editing && <p>
    {value}
  </p>}
}

请记住,您可能会使用如下所示的某种钩子来消除输入的抖动。这会在用户每次输入输入时阻止输入执行 Web 请求。

import * as React from 'react'

export const useDebounce = (
  value,
  setValue,
  timeout = 100,
) => {
  React.useEffect(() => {
    const timeoutId = setTimeout(() => setValue(), timeout)

    return () => clearTimeout(timeoutId)
  }, [value])
}

您还需要研究 React 中的短路条件渲染。这是当您在该组件的返回值中执行上述技术时。即{booleanValue &amp;&amp; &lt;JSX /&gt;{!booleanValue &amp;&amp; &lt;JSX /&gt;}。在 React 中拥有非常干净的渲染代码是一种很好的方式。

如果你决定使用 redux,你需要做的远不止这些。

【讨论】:

  • 其他用户是否可以看到此编辑?以及保持永久?
  • 如果您希望它只能由管理员编辑,您必须实现身份验证代码,将用户的角色存储在应用程序的某个地方而不是浏览器中(因为这对某人来说真的很容易假装是管理员)。但是,身份验证超出了这个问题的范围。如果您想做任何形式的身份验证,我强烈建议 npmjs.com/package/react-google-login 使用 google 帐户或其他形式的 oauth 进行身份验证。这还需要一个后端并检查用户是否在受保护的端点上进行了身份验证。
  • 如果这只是一个学校项目并且您需要功劳,您也可以使用 /login 和 /logout 端点创建一个简单的后端。只知道它不安全。因此,如果安全性是评分的一个因素,请坚持使用 google 的 oauth 服务。这是使用 google 进行 oauth 的说明。 support.google.com/googleapi/answer/6158849?hl=en 听起来这个应用程序很复杂。我真的建议你和你的团队一起学习redux.js.org,并使用像 redux-thunk 或 redux-sagas 这样的中间件来处理 Web 请求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 2011-07-09
  • 2016-01-18
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
相关资源
最近更新 更多