首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >样式-jsx动态样式未应用

样式-jsx动态样式未应用
EN

Stack Overflow用户
提问于 2020-05-05 06:13:20
回答 3查看 925关注 0票数 1

背景:

GridPreviewApp中接受“长度和宽度”,用于在for loop中呈现子元素GridTile

怎么了,

不应用GridTile组件中的样式。

vscode 0错误,0警告。Webpack编译成功。浏览器控制台0错误。

代码语言:javascript
复制
import React, { useState, useEffect, useCallback } from "react";
import ReactDOM from "react-dom";

function App() {
  const [gridW, setGridW] = useState<number>(5);
  const [gridH, setGridH] = useState<number>(5);
  const setGrid = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
    const current = e.currentTarget;
    switch (current.className) {
      case "setGridW": {
        setGridW(parseInt(current.value));
        break;
      }
      case "setGridH": {
        setGridH(parseInt(current.value));
        break;
      }
    }
  }, []);
  useEffect(() => {}, [gridW, gridH]);
  return (
    <>
      <div className="gridSizeSetting">
        <label htmlFor="">
          width
          <input
            type="range"
            min="1"
            max="24"
            step="1"
            value={gridW}
            className="setGridW"
            onChange={setGrid}
            name=""
            id=""
          />
        </label>
        <span>X</span>
        <label htmlFor="">
          height
          <input
            type="range"
            min="1"
            max="24"
            step="1"
            value={gridH}
            className="setGridH"
            onChange={setGrid}
            name=""
            id=""
          />
        </label>
      </div>
      <GridPreview w={gridW} h={gridH}></GridPreview>
    </>
  );
}

function GridTile({
  indexOfW,
  indexOfH,
}: {
  indexOfW: number;
  indexOfH: number;
}) {
  return (
    <div className={`tile ${indexOfW}-${indexOfH}`}>
      {`${indexOfW}-${indexOfH}`}
      <style jsx>{`
        div {
          background-color: rgb(
            ${Math.random() * 100 + 100},
            ${Math.random() * 100 + 100},
            ${Math.random() * 100 + 100}
          );
          justify-self: stretch;
          align-self: stretch;
          grid-column: ${indexOfH + 1};
          grid-row: ${indexOfW + 1};
        }
      `}</style>
    </div>
  );
}

function GridPreview({ w, h }: { w: number; h: number }) {
  const tiles: Array<JSX.Element> = [];
  for (let indexOfW = 0; indexOfW < w; indexOfW++) {
    for (let indexOfH = 0; indexOfH < h; indexOfH++) {
      tiles.push(
        <GridTile
          key={`${indexOfW},${indexOfH}`}
          indexOfH={indexOfH}
          indexOfW={indexOfW}
        ></GridTile>
      );
    }
  }
  return (
    <div className="container">
      {tiles}
      <style jsx>{`
        .container {
          height: 800px;
          display: grid;
          grid-template-rows: repeat(${w}, 1fr);
          grid-template-columns: repeat(${h}, 1fr);
        }
      `}</style>
    </div>
  );
}

ReactDOM.render(<App />, document.querySelector("#root"));

浏览器截图

dev开发工具屏幕截图

EN

回答 3

Stack Overflow用户

发布于 2020-05-05 08:56:29

styled-jsx似乎只能接收简单的字符串或表达式。

请参阅:https://github.com/zeit/styled-jsx/issues/595

代码语言:javascript
复制
function GridTile({
  indexOfW,
  indexOfH,
}: {
  indexOfW: number;
  indexOfH: number;
}) {
  const color = `rgb(
  ${Math.random() * 100 + 100},
  ${Math.random() * 100 + 100},
  ${Math.random() * 100 + 100}
)`;
  return (
    <div className={`tile ${indexOfW}-${indexOfH}`}>
      {`${indexOfW}-${indexOfH}`}
      <style jsx>{`
        .tile {
          background-color: ${color};
          justify-self: stretch;
          align-self: stretch;
          grid-column: ${indexOfH + 1};
          grid-row: ${indexOfW + 1};
        }
      `}</style>
    </div>
  );
}

background-color<style jsx>中移除是可行的。

票数 0
EN

Stack Overflow用户

发布于 2020-05-05 06:26:05

我不知道如何使用<style jsx>,但您可以使用内联样式,如下所示:

代码语言:javascript
复制
let container = {
 height: '800px',
 display: 'grid',
 gridTemplateRows: `repeat(${w}, 1fr)`,
 gridTemplateColumns: `repeat(${h}, 1fr)`
}
      
 return (
    <div style={container}>
      {tiles}

    </div>
  );

编辑:

在分析了代码之后,我认为这就是问题所在:

代码语言:javascript
复制
background-color: rgb(
            ${Math.random() * 100 + 100}px,
            ${Math.random() * 100 + 100}px,
            ${Math.random() * 100 + 100}px
          );

您正在指定rgb()的​​值(以像素为单位)。

票数 -1
EN

Stack Overflow用户

发布于 2020-05-05 09:20:19

不应用GridTile组件中的样式。

vscode 0错误,0警告。Webpack编译成功。浏览器控制台0错误。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61606846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档