Skip to main content

How to add data in array in form state in React

Problem Screenshot

I am trying to use the form to add data to the form data I want the question to go into question as shown in the form data then I want the options to go into the options array as `

{ letter: "A", answer: "", isTrue: false },
      { letter: "B", answer: "", isTrue: false },
      { letter: "C", answer: "", isTrue: false },
      { letter: "D", answer: "", isTrue: false },

` but I am finding difficult The questions can be added and dynamically and changing just the questions works individually but I can't get to do the same for the options Please help me achieve this, even if it can be done in another totally different way

  const [questionId, setQuestionId] = useState(0);
  const [questions, setQuestions] = useState({});

  const [form, setForm] = useState([]);
  const [opt, setOpt] = useState([]);

  const opts = ["A", "B", "C", "D"];

  const handleAddData = (e) => {
    e.preventDefault();
    const inputState = {
      question: "",
      options: [],
    };
    setForm((prev) => [...prev, inputState]);
  };

  const addOpt = () => {
    const initialState = {
      letter: "",
      answer: "",
      isTrue: false,
    };

    setOpt((prev) => [...prev, initialState]);
    opt.filter((item) => item.letter !== "");
    console.log(opt.filter((item) => item.letter !== ""));
  };

  const handleRemove = (index, e) => {
    e.preventDefault();

    setForm((prev) => prev.filter((item) => item !== prev[index]));
  };

  const onChange = (index, e) => {
    e.preventDefault();
    e.persist();

    setForm((prev) => {
      return prev.map((item, i) => {
        if (i !== index) return item;
        console.log(item);
        item.options.map((op, ind) => {
          console.log(`${op}: ${ind}`);
        });
        return {
          ...item,
          [e.target.name]: e.target.value,
          options: opt.filter((item) => item.letter !== ""),
        };
      });
    });
  };
  const onOptChange = (e, index) => {
    e.preventDefault();
    e.persist();
    let opt = e.target.placeholder.slice(-1);
    console.log(opt);

    let options = [
      { letter: "A", answer: "", isTrue: false },
      { letter: "B", answer: "", isTrue: false },
      { letter: "C", answer: "", isTrue: false },
      { letter: "D", answer: "", isTrue: false },
    ];
  };

  return (
    <Container>
      <Segment>
        <Item.Group>
          <Item>
            <Item.Content>
              <Form>
                {JSON.stringify(form)}
                {form.map((item, index) => (
                  <>
                    <Card.Group key={index}>
                      <Card fluid color="red" className="p1">
                        <Form.TextArea
                          label="Question"
                          placeholder="Enter Question"
                          name="question"
                          value={item.question}
                          onChange={(e) => onChange(index, e)}
                        />
                        <Form.Group widths="equal">
                          <Form.Field>
                            <Input
                              label="Option A"
                              placeholder="Enter Option A"
                              key={index}
                              fluid
                              name="answer"
                              onChange={(e) => onOptChange(e)}
                            />
                          </Form.Field>
                          <Form.Field>
                            <Input
                              label="Option B"
                              placeholder="Enter Option B"
                              key={index}
                              fluid
                              name="answer"
                              onChange={(e) => onOptChange(e)}
                            />
                          </Form.Field>
                        </Form.Group>

                        <Form.Group widths="equal">
                          <Form.Field>
                            <Input
                              label="Option C"
                              placeholder="Enter Option C"
                              key={index}
                              fluid
                              name="answer"
                              onChange={(e) => onOptChange(e)}
                            />
                          </Form.Field>
                          <Form.Field>
                            <Input
                              label="Option D"
                              placeholder="Enter Option D"
                              key={index}
                              fluid
                              name="answer"
                              onChange={(e) => onOptChange(e)}
                            />
                          </Form.Field>
                        </Form.Group>
                        <Form.Field>
                          <Input
                            label="Correct Answer"
                            placeholder="Enter Correct Answer"
                            fluid
                            name="correct_answer"
                          />
                        </Form.Field>
                      </Card>
                    </Card.Group>
                    <Button
                      // primary
                      size="small"
                      icon="minus"
                      labelPosition="right"
                      content="Remove"
                      className="mt-2"
                      color="red"
                      onClick={(e) => handleRemove(index, e)}
                      // disabled={!allFieldsSelected || processing}
                    />
                    <Divider />
                  </>
                ))}
                <Button
                  primary
                  size="small"
                  icon="plus"
                  labelPosition="right"
                  content="Add"
                  className="mt-2"
                  onClick={handleAddData}
                />
              </Form>
            </Item.Content>
          </Item>
        </Item.Group>
      </Segment>
      <br />
    </Container>

I tried using this onOptChange below to change the options array individually but couldn't get a good result

const onOptChange = (e, index) => {
    e.preventDefault();
    e.persist();
    let opt = e.target.placeholder.slice(-1);
    console.log(opt);

    let options = [
      { letter: "A", answer: "", isTrue: false },
      { letter: "B", answer: "", isTrue: false },
      { letter: "C", answer: "", isTrue: false },
      { letter: "D", answer: "", isTrue: false },
    ];
  };
Via Active questions tagged javascript - Stack Overflow https://ift.tt/iKLH3bx

Comments

Popular posts from this blog

Prop `className` did not match in next js app

I have written a sample code ( Github Link here ). this is a simple next js app, but giving me error when I refresh the page. This seems to be the common problem and I tried the fix provided in the internet but does not seem to fix my issue. The error is Warning: Prop className did not match. Server: "MuiBox-root MuiBox-root-1" Client: "MuiBox-root MuiBox-root-2". Did changes for _document.js, modified _app.js as mentioned in official website and solutions in stackoverflow. but nothing seems to work. Could someone take a look and help me whats wrong with the code? Via Active questions tagged javascript - Stack Overflow https://ift.tt/2FdjaAW

How to show number of registered users in Laravel based on usertype?

i'm trying to display data from the database in the admin dashboard i used this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count(); echo $users; ?> and i have successfully get the correct data from the database but what if i want to display a specific data for example in this user table there is "usertype" that specify if the user is normal user or admin i want to user the same code above but to display a specific usertype i tried this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count()->WHERE usertype =admin; echo $users; ?> but it didn't work, what am i doing wrong? source https://stackoverflow.com/questions/68199726/how-to-show-number-of-registered-users-in-laravel-based-on-usertype

Why is my reports service not connecting?

I am trying to pull some data from a Postgres database using Node.js and node-postures but I can't figure out why my service isn't connecting. my routes/index.js file: const express = require('express'); const router = express.Router(); const ordersCountController = require('../controllers/ordersCountController'); const ordersController = require('../controllers/ordersController'); const weeklyReportsController = require('../controllers/weeklyReportsController'); router.get('/orders_count', ordersCountController); router.get('/orders', ordersController); router.get('/weekly_reports', weeklyReportsController); module.exports = router; My controllers/weeklyReportsController.js file: const weeklyReportsService = require('../services/weeklyReportsService'); const weeklyReportsController = async (req, res) => { try { const data = await weeklyReportsService; res.json({data}) console