как я могу вызвать метод динамически в ответных хуках - PullRequest
0 голосов
/ 02 июля 2019

В моих хуках React я определил две функции для установки переменных: setProjectMiddleCode и setProjectToolCode.

Я надеюсь вызвать эти два метода в моих хуках реагирования, чтобы избежать дублирования кода.

Я хотел бы сделать это так:

//variable define
let data;
let index = res.data.indexOf(res.code.value);

//call dynamic

if(some state ==='A'){
 data= "setProjectMiddleCode"
}else{
 data = "setProjectToolCode"
}

if (index < 0) {
  this[data](res.data.concat(res.code.value));
} else {
  this[data](res.data.filter((_, i) => i !== index));
}

Мой текущий код:

  const [projectMiddleCode, setProjectMiddleCode] = useState([]);
  const [projectToolCode, setProjectToolCode] = useState([]);

const ProjectWrite = memo(({}) => {
  let component;
  const dispatch = useDispatch();

  const [projectMiddleCode, setProjectMiddleCode] = useState([]);
  const [projectToolCode, setProjectToolCode] = useState([]);

  const callbackFromChild = useCallback(
    res => () => {
        let index = res.data.indexOf(res.code.value);

      if (res.codeName === 'PROJECT_MIDDLE_CODE') {
        if (index < 0) {
          setProjectMiddleCode(res.data.concat(res.code.value));
        } else {
          setProjectMiddleCode(res.data.filter((_, i) => i !== index));
        }
      } else if (res.codeName === 'TOOL_LIST') {
        if (index < 0) {
          setProjectToolCode(res.data.concat(res.code.value));
        } else {
          setProjectToolCode(res.data.filter((_, i) => i !== index));
        }
      }
    },
    []
  );

1 Ответ

0 голосов
/ 02 июля 2019

Один из способов сделать это - создать карту с res.codeName для ваших функций:

const { codeName, code, data } = res;
const index = data.indexOf(code.value);

const funcMap = {
  PROJECT_MIDDLE_CODE: setProjectMiddleCode,
  TOOL_LIST: setProjectToolCode
}


const newData = index < 0 ? data.concat(code.value) : data.filter((_, i) => i !== index);

const func = funcMap[codeName];

func(newData);
...