【问题标题】:Konva infinite grid in ReactReact 中的 Konva 无限网格
【发布时间】:2020-02-15 02:42:56
【问题描述】:

我,我正在尝试通过一个包 react -konva 来学习如何使用画布。我找到了我需要用 javascript 编写的确切内容,但我需要让它像反应组件一样,并在按钮单击矩形的地方添加图像。谁能帮我重新组织代码以在反应中显示它......这是我在网上找到的小提琴......https://jsfiddle.net/kiksy/jqo2h3dx/2/

const stage = new Konva.Stage({
            container: 'container',
            width: window.innerWidth,
            height: window.innerHeight,
            draggable: true
        });

        const layer = new Konva.Layer();
        stage.add(layer);


        const WIDTH = 100;
        const HEIGHT = 100;

        const grid = [
            ['red', 'yellow'],
            ['green', 'blue']
        ];

        const blocks = [
            { w: 150, h: 150 , background: "white" , image: "/img/test2.png" , fullImage: false, title: "" , text: "" },
            { w: 150, h: 150 , background: "white" , image: "/img/person-icon.png" ,  fullImage: false ,title: "" , text: "" },
            { w: 150, h: 150 , background: "#575756" , image: "" ,  fullImage: false, title: "Title" , text: "" },
            { w: 300, h: 300 , background: "white" , image: "/img/test.png", fullImage: true, title: "" , text: "" }

        ];

            function checkShapes() {
            const startX = Math.floor((-stage.x() - stage.width()) / WIDTH) * WIDTH;
            const endX = Math.floor((-stage.x() + stage.width() * 2) / WIDTH) * WIDTH;

            const startY = Math.floor((-stage.y() - stage.height()) / HEIGHT) * HEIGHT;
            const endY = Math.floor((-stage.y() + stage.height() * 2) / HEIGHT) * HEIGHT;



            var i = 0;
            for(var x = startX; x < endX; x += WIDTH) {
                for(var y = startY; y < endY; y += HEIGHT) {

                    if(i === 4)
                    {
                        i = 0;
                    }

                    const indexX = Math.abs(x / WIDTH) % grid.length;
                    const indexY = Math.abs(y / HEIGHT) % grid[0].length;

                    layer.add(new Konva.Rect({
                        x,
                        y,
                        width: WIDTH,
                        height: HEIGHT,
                        fill: grid[indexX][indexY],
                        stroke: 'black',
                        strokeWidth: 4
                    }))

                    if(blocks[i].title != ""){

                        var complexText = new Konva.Text({
                            x,
                            y,
                            text: "TEST TEXT",
                            fontSize: 14,
                            fontFamily: 'Calibri',
                            fill: 'white',
                            width: WIDTH,
                            height: HEIGHT,
                            verticalAlign: 'middle',
                            align : "center"
                        });

                        layer.add(complexText);

                    }



                }
                i++
            }

        }

        checkShapes();
        layer.draw();

        stage.on('dragend', () => {
            layer.destroyChildren();
            checkShapes();
            layer.draw();
        })

【问题讨论】:

    标签: javascript reactjs grid konvajs react-konva


    【解决方案1】:

    这是我的解决方案:

    const WIDTH = 100;
    const HEIGHT = 100;
    
    const grid = [["red", "yellow"], ["green", "blue"]];
    
    const App = () => {
      const [stagePos, setStagePos] = React.useState({ x: 0, y: 0 });
      const startX = Math.floor((-stagePos.x - window.innerWidth) / WIDTH) * WIDTH;
      const endX =
        Math.floor((-stagePos.x + window.innerWidth * 2) / WIDTH) * WIDTH;
    
      const startY =
        Math.floor((-stagePos.y - window.innerHeight) / HEIGHT) * HEIGHT;
      const endY =
        Math.floor((-stagePos.y + window.innerHeight * 2) / HEIGHT) * HEIGHT;
    
      const gridComponents = [];
      var i = 0;
      for (var x = startX; x < endX; x += WIDTH) {
        for (var y = startY; y < endY; y += HEIGHT) {
          if (i === 4) {
            i = 0;
          }
    
          const indexX = Math.abs(x / WIDTH) % grid.length;
          const indexY = Math.abs(y / HEIGHT) % grid[0].length;
    
          gridComponents.push(
            <Rect
              x={x}
              y={y}
              width={WIDTH}
              height={HEIGHT}
              fill={grid[indexX][indexY]}
              stroke="black"
            />
          );
        }
      }
      return (
        <Stage
          x={stagePos.x}
          y={stagePos.y}
          width={window.innerWidth}
          height={window.innerHeight}
          draggable
          onDragEnd={e => {
            setStagePos(e.currentTarget.position());
          }}
        >
          <Layer>{gridComponents}</Layer>
        </Stage>
      );
    };
    

    你只需要以同样的方式生成节点。

    演示:https://codesandbox.io/s/react-konva-infinite-grid-kkndq

    【讨论】:

    • 嘿@lavroto!我试图在我的 React 项目中使用无限网格,但我无法为每个矩形(反应迭代器所需)创建一个唯一的键,并具有性能。能给个提示吗?
    • 这取决于网格类型。在这种情况下,只使用索引可以很好地工作。
    • 在哪里可以获得该索引?我的意思是在 gridComponents.push(
    • key={x + '-' + y}
    • 再次感谢@lavrton!!!!它工作得很好,性能也很好!
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签