React hooks: Как объединить event.target.name и event.target.value с объектом, используя useState - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть changeHandler, который я использую для добавления состояния в родительский компонент:

  function handleChange(event) {
      var { name, value } = event.target;
      if (dayInfoInChild.hasOwnProperty(currentDate)) {
        setDayInfoInChild({ ...dayInfoInChild.currentDate, [name]: value });
      }
    }

Это весь код:

import { Header, Table, TextArea } from 'semantic-ui-react';
import React, { useState, useEffect } from 'react';

export default function Day({ dayInfo, props }) {
  var [dayInfoInChild, setDayInfoInChild] = useState({});
  var [currentDate, setCurrentDate] = useState('');
  var [timeOfDay, setTimeOfDay] = useState('');

  function setExactHourHelper(index) {
    return index === 0 ? 12 : '' || index > 12 ? index - 12 : index;
  }

  function TimeOfDaySetter(index) {
    if (index === 0) {
      return <Header as="h1">AM</Header>;
    } else if (index === 12) {
      // setTimeOfDay('PM');
      return <Header as="h1">PM</Header>;
    }
  }

  useEffect(() => {
    if (dayInfo !== null) {
      var modifiedDayInfo = dayInfo
        .split(' ')
        .map((item) => {
          if (item.indexOf(',')) return item.replace(/,/g, '');
        })
        .join('-');

      setCurrentDate(modifiedDayInfo);

      if (localStorage.getItem(modifiedDayInfo)) {
        var stringVersionOfModifiedDayInfo = modifiedDayInfo;

        modifiedDayInfo = JSON.parse(localStorage.getItem(modifiedDayInfo));

        if (!dayInfoInChild.hasOwnProperty(stringVersionOfModifiedDayInfo)) {
          setDayInfoInChild({
            ...dayInfoInChild,
            [stringVersionOfModifiedDayInfo]: modifiedDayInfo,
          });
        }

        console.log('dayInfoInChild', dayInfoInChild);
        console.log(
          'stringVersionOfModifiedDayInfo',
          stringVersionOfModifiedDayInfo
        );
      } else {
        localStorage.setItem(modifiedDayInfo, JSON.stringify({}));
      }
    }
  }, [dayInfo, dayInfoInChild]);

  function TableLayout({}) {
    var [amountOfRows, setAmountOfRows] = useState(24);
    var [textValue, setTextValue] = useState('');

    function handleChange(event) {
      var { name, value } = event.target;
      if (dayInfoInChild.hasOwnProperty(currentDate)) {
        setDayInfoInChild({ [dayInfoInChild.currentDate]: { [name]: value } });
      }
    }

    const tableStyle = {
      borderLeft: 0,
      borderRight: 0,
    };

    const colorOveride = {
      color: '#C1BDBD',
    };

    return (
      <>
        {console.log('dayInfoInChild', dayInfoInChild)}
        <h1>{dayInfo}</h1>
        <Table celled structured>
          <Table.Body>
            {Array.from(Array(amountOfRows)).map((row, index) => {
              return (
                <React.Fragment key={index}>
                  <Table.Row>
                    <Table.Cell rowSpan="2" style={tableStyle}>
                      {TimeOfDaySetter(index)}
                    </Table.Cell>
                    <Table.Cell style={tableStyle}>
                      {
                        <strong>
                          {setExactHourHelper(index)}
                          :00
                        </strong>
                      }
                      <TextArea
                        rows={2}
                        name="textarea"
                        value={textValue}
                        onChange={handleChange}
                        placeholder="Tell us more"
                      />
                    </Table.Cell>
                  </Table.Row>
                  <Table.Row>
                    <Table.Cell style={(tableStyle, colorOveride)}>
                      {
                        <strong>
                          {setExactHourHelper(index)}
                          :30
                        </strong>
                      }
                      <TextArea rows={2} placeholder="Tell us more" />
                    </Table.Cell>
                  </Table.Row>
                </React.Fragment>
              );
            })}
          </Table.Body>
        </Table>
      </>
    );
  }

  {
    if (dayInfo === null) {
      return <p>Loading...</p>;
    }
  }

  return (
    <React.Fragment>
      <TableLayout dayInfo={dayInfo} />
    </React.Fragment>
  );
}

Но я получаю это вместо недвижимость на объекте:

![enter image description here

Как получить:

dayInfoInChild: { April-16-2020: {textarea: "g"} }

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Хотите переопределить состояние или просто какое-нибудь обновление?

Я не тестировал, но, кажется, вам нужно сделать что-то подобное:

function handleChange(event) {
      var { name, value } = event.target;
      if (dayInfoInChild.hasOwnProperty(currentDate)) {
        setDayInfoInChild({ 
           ...dayInfoInChild,
           [dayInfoInChild.currentDate]:{[name]: value} 
        }); 
      }
    }

Я надеюсь, что это тебе поможет!

1 голос
/ 12 апреля 2020

Попробуйте:

function handleChange(event) {
      var { name, value } = event.target;
      if (dayInfoInChild.hasOwnProperty(currentDate)) {
        setDayInfoInChild({ [dayInfoInChild.currentDate]: { [name]: value } });
      }
    }

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...