【问题标题】:Array sequence (string) returns the next visible button - React数组序列(字符串)返回下一个可见按钮 - React
【发布时间】:2021-08-01 03:57:54
【问题描述】:

链接代码:DEMO

通过拖放,我组装了一个序列,即 const correctSequence = ["task-5", "task-3", "task-2", "task-1", "task-4"];当顺序正确时,我的当前按钮被禁用,它变为启用

【问题讨论】:

  • 请在此处发布您的代码,并附上关于您需要帮助的具体问题。
  • 这并没有真正的帮助。将您需要帮助的代码放在问题中,解释您的预期以及它正在做什么。
  • 我只是想给你一些建议。在这里获得帮助的最佳方式是将您的代码放入问题中,并准确说明您需要帮助的部分。
  • @Bafsky 感谢您的提示,但在这种情况下,我在组件之间使用了一些道具,因此我将示例留在了演示链接上。但简而言之,我有一个 和 useState = const [disabled, setDisabled] = useState (true);然后我创建了一个具有正确序列顺序的 const: const correctSequence = ["task-5", "task-3", "task-2", "task-1", "task-4"];现在的问题是如何检查序列,如果正确,请启用按钮

标签: arrays reactjs button react-functional-component


【解决方案1】:

您只是错过了正确设置启用和禁用操作

 useEffect(() => {
    console.log(state.columns["column-2"].taskIds, correctSequence);

    if(JSON.stringify(state.columns["column-2"].taskIds) === JSON.stringify(correctSequence)){
      setDisabled(false);
    }else {
      setDisabled(true);
    }
  }, [state]);

此代码将检查订单列是否等于您的正确顺序,如果不正确则禁用否则启用它

最终代码:

import React, { useEffect, useState } from "react";
import { DragDropContext } from "react-beautiful-dnd";
import Column from "./Column";
import { Typography, Button } from "@material-ui/core";
import { initialData } from "./initial-data";
import Paper from "@material-ui/core/Paper";
import { makeStyles } from "@material-ui/core/styles";

// ESTYLES MATERIAL UI
const useStyles = makeStyles((theme) => ({
  root: {
    flexGrow: 1,
    overflow: "hidden",
    backgroundColor: "#EBE9E9"
  },
  box: {
    border: "2px solid #EBE9E9",
    height: "auto",
    marginBottom: "36px",
    backgroundColor: "#EBE9E9"
  },
  paper: {
    maxWidth: 560,
    margin: `${theme.spacing(1)}px auto`,
    backgroundColor: "#EBE9E9",
    boxShadow: ["none"]
  },
  button: {
    color: "#000000",
    backgroundColor: "#ffdd03",
    borderRadius: "30px",
    fontWeight: 500,
    fontFamily: "Rubik",
    fontSize: "15px",
    marginTop: "10px",
    boxShadow:
      "0px 3px 1px -2px rgb(0 0 0 / 20%), 0px 2px 2px 0px rgb(0 0 0 / 14%), 0px 1px 5px 0px rgb(0 0 0 / 12%)",
    "&:hover": {
      backgroundColor: "#ffff54"
    },
    "&:active": {
      backgroundColor: "#ffff54",
      boxShadow: "none"
    }
  },
  disabled: {}
}));

const App = (props) => {
  const [state, setState] = useState(initialData);
  const classes = useStyles();

  // buttond disabled
  const [disabled, setDisabled] = useState(true);

  // sequence correct
  const correctSequence = ["task-5", "task-3", "task-2", "task-1", "task-4"];

  const onDragEnd = (result) => {
    const { destination, source, draggableId } = result;

    if (!destination) {
      return;
    }

    if (
      destination.droppableId === source.droppableId &&
      destination.index === source.index
    ) {
      return;
    }

    const start = state.columns[source.droppableId];
    const finish = state.columns[destination.droppableId];

    if (start === finish) {
      const newTaskIds = Array.from(start.taskIds);
      newTaskIds.splice(source.index, 1);
      newTaskIds.splice(destination.index, 0, draggableId);

      const newColumn = {
        ...start,
        taskIds: newTaskIds
      };

      const newState = {
        ...state,
        columns: {
          ...state.columns,
          [newColumn.id]: newColumn
        }
      };

      setState(newState);
      return;
    }

    // Moving from one list to another
    const startTaskIds = Array.from(start.taskIds);
    startTaskIds.splice(source.index, 1);
    const newStart = {
      ...start,
      taskIds: startTaskIds
    };

    const finishTaskIds = Array.from(finish.taskIds);
    finishTaskIds.splice(destination.index, 0, draggableId);
    const newFinish = {
      ...finish,
      taskIds: finishTaskIds
    };

    const newState = {
      ...state,
      columns: {
        ...state.columns,
        [newStart.id]: newStart,
        [newFinish.id]: newFinish
      }
    };
    setState(newState);
  };

  useEffect(() => {
    console.log(state.columns["column-2"].taskIds, correctSequence);

    if(JSON.stringify(state.columns["column-2"].taskIds) === JSON.stringify(correctSequence)){
      setDisabled(false);
    }else {
      setDisabled(true);
    }
  }, [state]);

  return (
    <div className={classes.root}>
      <Paper className={classes.paper}>
        <DragDropContext onDragEnd={onDragEnd}>
          <div title="EDUCAÇÃO BÁSICA">
            {state.columnOrder.map((columnId) => {
              const column = state.columns[columnId];
              const tasks = column.taskIds.map((taskId) => state.tasks[taskId]);
              return <Column key={column.id} column={column} tasks={tasks} />;
            })}
          </div>
        </DragDropContext>
        <Typography align="center">
          <Button
            variant="contained"
            disabled={disabled}
            className={classes.button}
          >
            Next
          </Button>
        </Typography>
      </Paper>
    </div>
  );
};

export default App;

【讨论】:

  • 感谢代码完美运行的帮助,我没想到检查专栏,你是个天才:)
  • Apper:React Hook useEffect 缺少依赖项:'correctSequence'。要么包含它,要么删除依赖数组。 (react-hooks/exhaustive-deps)
  • 是的,你可以添加它,但是由于它的常量,它不会做任何改变,如果它将来会改变......
  • 我输入了以下代码,现在错误不再显示: // eslint-disable-next-line }, [state]);
猜你喜欢
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
  • 2020-08-25
  • 2014-02-13
  • 2017-10-09
  • 1970-01-01
相关资源
最近更新 更多