如何使用带有React JS的CKEditor捕获OnChange事件

问题描述 投票:0回答:1

我正在使用React,Django和Graphene构建博客应用。我想将CKEditor组件集成到React前端中,但是我似乎能够从CKEditor中获取数据并存储在状态中。每次我在文本字段中键入时,都会收到以下错误“ CKEditorError:无法读取未定义的属性'value'”。如果您能帮助指出我做错了还是没有做,请对我表示感谢。我的代码在下面。

import React, { useState, Fragment } from "react";
import { Mutation } from "react-apollo";
import { gql } from "apollo-boost";
import axios from "axios";

import CKEditor from '@ckeditor/ckeditor5-react';
import ClassicEditor from '@ckeditor/ckeditor5-build-classic';

import { makeStyles } from "@material-ui/core/styles";

import {
  Button,
  Input,
  TextField,
  Container,
  Typography
} from "@material-ui/core";

const useStyles = makeStyles(theme => ({
  paper: {
    marginTop: theme.spacing(12),
    display: "flex",
    flexDirection: "column",
    alignItems: "center"
  },
  avatar: {
    margin: theme.spacing(1),
    backgroundColor: theme.palette.secondary.main
  },
  form: {
    width: "100%", // Fix IE 11 issue.
    marginTop: theme.spacing(1)
  },
  submit: {
    margin: theme.spacing(3, 0, 2)
  }
}));

const CreatePost = () => {
  const classes = useStyles();
  // const [open, setOpen] = useState(false);
  const [title, setTitle] = useState("");
  const [content, setContent] = useState("");
  const [file, setFile] = useState("");
  const [submitting, setSubmitting] = useState(false);

  const handleImageChange = event => {
    const selectedFile = event.target.files[0];
    setFile(selectedFile);
  };

  const handleImageUpload = async () => {
    try {
      const data = new FormData();
      data.append("file", file);
      data.append("resource_type", "image");
      data.append("upload_preset", "nanan");
      data.append("cloud_name", "nana");

      const res = await axios.post(
        "https://api.cloudinary.com/v1_1/nana/image/upload/",
        data
      );
      console.log(res.data.url);
      return res.data.url;
    } catch (error) {
      console.error("Error uploading file", error);
      setSubmitting(false);
    }
  };

  const handleSubmit = async (event, createPost) => {
    event.preventDefault();
    setSubmitting(true);
    const uploadUrl = await handleImageUpload();
    createPost({ variables: { title, content, thumb: uploadUrl } });
  };

  return (
    <Container component="main" maxWidth="xs">
      <div className={classes.paper}>
        <Typography component="h1" variant="h5">
          Create A Post
        </Typography>
        <Mutation
          mutation={CREATE_POST_MUTATION}
          onCompleted={data => {
            setSubmitting(false);
            setTitle("");
            setContent("");
            setFile("");
          }}
        >
          {(createPost, { loading, error }) => {
            if (error) return <div>error!!!</div>;
            return (
              <form
                className={classes.form}
                onSubmit={event => handleSubmit(event, createPost)}
              >
                <TextField
                  autoFocus
                  label="Title"
                  type="text"
                  id="title"
                  required
                  onChange={event => setTitle(event.target.value)}
                  margin="normal"
                  required
                  fullWidth
                  name="title"
                  autoComplete="title"
                />

<CKEditor
                  editor={ ClassicEditor }
                  name="content"
                  label="Content"
                  type="text"
                  id="content"
                  onChange={event => setContent(event.target.value)}
                />

                <Input
                  type="file"
                  fullWidth
                  id="image"
                  required
                  type="file"
                  accept="image/png, image/jpeg"
                  onChange={handleImageChange}
                />
                <Button
                  type="submit"
                  fullWidth
                  variant="contained"
                  color="primary"
                  className={classes.submit}
                  disabled={
                    submitting || !title.trim() || !content.trim() || !file
                  }
                >
                  {loading ? "Submitting ..." : "Submit"}
                </Button>
              </form>
            );
          }}
        </Mutation>
      </div>
    </Container>
  );
};

export default CreatePost;

const CREATE_POST_MUTATION = gql`
  mutation($title: String!, $content: String, $thumb: String!) {
    createPost(title: $title, content: $content, thumb: $thumb) {
      post {
        id
        title
        content
        thumb
        createdAt
        slug
      }
    }
  }
`;
javascript django reactjs graphql graphene-python
1个回答
0
投票

1。安装ckeditor

https://ckeditor.com/docs/ckeditor5/latest/builds/guides/integration/frameworks/react.html

2。代码示例(带有React钩子)

import CKEditor from "@ckeditor/ckeditor5-react";
import ClassicEditor from "@ckeditor/ckeditor5-build-classic";

function Example(){
    const [data, setData] = React.useState('');
    const handleSubmit = (event) => {
        event.preventDefault();
        // Define your onSubmit function here
        // ...
    };

    const inputHandler = (event, editor) => {
        console.log(editor.getData());
        // Define your onSubmit function here
        // ...
        // for example, setData() here

    };

    return(
        <div className="Sumbit">
          <div>
            <form onSubmit={handleSubmit}>
              <div>
                <CKEditor
                  id="inputText"
                  editor={ClassicEditor}
                  onChange={inputHandler}
                />
              </div>
            </form>
          </div>
        </div>
    )
}

export default Example;
© www.soinside.com 2019 - 2024. All rights reserved.