GVKun编程网logo

Next.js - 使用 CSS 模块时无法应用动态类名(css不生效的原因)

11

在本文中,我们将详细介绍Next.js-使用CSS模块时无法应用动态类名的各个方面,并为您提供关于css不生效的原因的相关解答,同时,我们也将为您带来关于angular–在定位ECMAScript20

在本文中,我们将详细介绍Next.js - 使用 CSS 模块时无法应用动态类名的各个方面,并为您提供关于css不生效的原因的相关解答,同时,我们也将为您带来关于angular – 在定位ECMAScript 2015模块时无法使用导入分配、css – ReactJS向手动类名添加动态类、extjs JSONStore的load事件/insert,add方法应用 如何动态改变显示数据、extjs4 treepanel动态改变行高度示例_extjs的有用知识。

本文目录一览:

Next.js - 使用 CSS 模块时无法应用动态类名(css不生效的原因)

Next.js - 使用 CSS 模块时无法应用动态类名(css不生效的原因)

如何解决Next.js - 使用 CSS 模块时无法应用动态类名?

希望有人能帮我解决这个问题。

我正在尝试通过 NextJs 建立一个网站。我的其中一个页面有一些段落和按钮,它们的样式根据状态和事件而不同。使用纯 React 时,以及在 NextJs 中使用全局样式表时,我可以使样式按预期工作;但是当我使用 CSS 模块时,我无法让它按预期运行。

(注意:我也可以通过使用一个简单的三元来让它工作,比如 <h1 className={submitted ? styles.showresult : styles.hideresult}>Correct? {correct}</h1>; 但我还有其他一些场景,我需要依赖多个 if 并创建多个类,每个类都有自己的样式,因此我无法将简单的三元作为我的最终解决方案。

例如这是文件 pagex.js

import React from ''react'';
import ReactDOM from ''react-dom'';

const Pagex = () => {

const [submitted,setSubmitted] = React.useState(false); // whether the submit button was pressed

function calculatescore() {
  let correct = 0
  let incorrect = 0
    //......some scoring logic.....    
  setSubmitted(true)
  }

  // function to create a display class based on whether the submit button has been pressed
 function displayResult(){
   if (submitted === true) {
      return "showtheresult"
    } else {
         return "hidetheresult"
    }
  }

return (
  <section className="results">
      <h1 className={displayResult()}>Correct? {correct}</h1>
      <h1 className={displayResult()}>Incorrect? {incorrect}</h1>
  <button className={displayResult()} onClick={handleMovClick}>An instruction</button>
    </section>
    </div>
  );
};
export default Pagex;

globals.css 文件包含

h1.hidetheresult,h3.hidetheresult {
  visibility: hidden;
}

h1.showtheresult,h3.showtheresult {
  visibility: visible;
}

button.hidetheresult {
    border-color: pink;
  }

button.showtheresult {
    border-color: aqua;
  }

使用 CSS 模块时的变化

  1. 在正确的文件夹中添加一个具有正确名称的 CSS 文件 (../styles/Pagex.module.css) 包含相同的样式 以上
  2. pagex.js 中的额外导入 import styles from ''../styles/Pagex.module.css''
  3. 更改函数中的引用 在 pagex.js 中
    function displayResult(){
       if (submitted === true) {
          return {styles.showtheresult}
        } else {
             return {styles.hidetheresult}
        }
      }

当我这样做时,''.''在 {styles.showtheresult}{styles.hidetheresult} 中被 vscode 突出显示为错误,其中包含以下详细信息:'','' expected。 ts(1005)。 尝试编译后,在运行开发服务器的情况下保存 js 显示类似消息:语法错误:意外令牌,预期“,”,浏览器显示相同的消息以及 “编译失败"

还尝试通过从 displayResult() 函数中删除花括号来传递 styles.showtheresult / styles.hidetheresult。编译但在编译的网页上没有任何反应,即按下按钮时类不会更新,因此无法应用样式。

还尝试在 return 语句中作为 ${styles.showresult} 和 ${styles.hideresult} (带 `)传递。这也可以编译,但页面本身给了我一个“未处理的运行时错误参考错误:样式未定义”消息,我无法加载页面。

如果有人可以帮助纠正我在函数本身或代码中的其他地方的语法,我们将不胜感激。

解决方法

因为你问得很好;)(开玩笑的)

所以 Next.js 是一个固执己见的框架,它使用 CSS 模块来强制执行组件范围的样式。

基本上,您使用 name.module.css 文件名定义样式表并在其中添加常规 CSS。

.hidetheresult {
    visibility: hidden;
}

.showtheresult{
    visibility: visible;
}
  
.btn-hidetheresult {
    border-color: pink;
}

.btn-showtheresult {
    border-color: aqua;
}

现在要使用它,像导入任何 JS 模块一样导入它,

import styles from ''./styles.module.css''
console.log(styles);
// styles => {
//  hidetheresult: ''contact_hidetheresult__3LvIF'',//  showtheresult: ''contact_showtheresult__N5XLE'',//  ''btn-hidetheresult'': ''contact_btn-hidetheresult__3CQHv'',//  ''btn-showtheresult'': ''contact_btn-showtheresult__1rM1E''
//  }

如您所见,样式已转换为对象,现在您可以使用它们 像 styles.hidetheresultstyles[''btn-hidetheresult'']

注意样式表中没有元素选择器。那是因为 CSS Modules 重写了类名,但它们不涉及标签名。在 Next.js 中 默认行为。即它不允许元素标签选择器。

带有 *.module.(css | scss | sass) 的文件扩展名是 css 模块,它们只能使用类名或 id 来定位元素,而不能使用标签名称。虽然这在 create-react-app 等其他框架中是可能的,但在 next-js 中是不可能的。

但是您可以在 next.config.js 文件中覆盖它。 (超出本答案的范围)

有一个 article 解释了如何覆盖它。 - 免责声明:我是作者


现在来到您的用例,您可以像这样进行条件样式:(假设样式与答案中给出的示例一致)

import React from "react";
import styles from "./styles.module.css";

const PageX = () => {
  const [submitted,setSubmitted] = React.useState(false);

  const getStyle = () => {
    if (submitted) return styles.showtheresult;
    else return styles.hidetheresult;
  };

  const getButtonStyle = () => {
    if (submitted) return styles["btn-showtheresult"];
    else return styles["btn-hidetheresult"];
  };

  return (
    <div>
      <section className="results">
        <h1 className={getStyle()}>Correct?</h1>
        <h1 className={getStyle()}>Incorrect?</h1>
        <button className={getButtonStyle()} onClick={handleMovClick}>
          An instruction
        </button>
      </section>
    </div>
  );
};

随着您添加更多条件,方法往往会变得更加复杂。这是classnames 模块派上用场。

import styles from "./styles.module.css";
import clsx from "classnames";

const PageX = () => {
  const [submitted,setSubmitted] = React.useState(false);

  const headerStyle = clsx({
    [styles.showtheresult]: submitted,[styles.hidetheresult]: !submitted,});
  const btnStyle = clsx({
    [styles["btn-showtheresult"]]: submitted,[styles["btn-hidetheresult"]]: !submitted,});
  return (
    <div>
      <section className="results">
        <h1 className={headerStyle}>Correct?</h1>
        <h1 className={headerStyle}>Incorrect?</h1>
        <button className={btnStyle} onClick={handleMovClick}>
          An instruction
        </button>
      </section>
    </div>
  );
};

这是一个 CodeSandbox 供您使用: Edit 68554803-next-js-cant-apply-dynamic-class-names

angular – 在定位ECMAScript 2015模块时无法使用导入分配

angular – 在定位ECMAScript 2015模块时无法使用导入分配

我正在尝试使用以下行:
import Clipboard = require('clipboard');

我收到以下错误:

[default] c:\xampp\htdocs\isitperfect\node_modules\angular2-clipboard\src\clipboard.directive.ts:2:0 
Import assignment cannot be used when targeting ECMAScript 2015 modules. Consider using 'import * as ns from "mod"','import {a} from "mod"','import d from "mod"',or another module format instead.

错误在这一行:

import Clipboard = require('clipboard');

我试过了:

import * as Clipboard from 'clipboard';

和其他一些变化,但无法弄清楚如何解决它.

我正在使用typescript 2.0.0

有任何想法吗?

我和你一样面临同样的问题.

在tsconfig.json文件中我替换了:

"module": "es6"

"module": "commonjs"

并重新启动终端.有效.

css – ReactJS向手动类名添加动态类

css – ReactJS向手动类名添加动态类

我需要添加一个动态类到一个常规类的列表,但不知道如何(我使用babel),像这样:
<div className="wrapper searchdiv {this.state.something}">
...
</div>

有任何想法吗?

谢谢

解决方法

你可以这样做,一般的javascript:

className = {‘wrapper searchdiv’this.state.something}

或字符串模板版本

带有反引号的className = {`wrapper searchdiv ${this.state.something}`}.

这两种类型当然只是javascript,但是第一种模式是传统的.无论如何,在JSX中,任何用大括号括起来的东西都会被执行为javascript,所以你基本上可以做任何你想要的东西.但是,将JSX字符串和大括号结合在一起就是属性的no-go.

extjs JSONStore的load事件/insert,add方法应用 如何动态改变显示数据

extjs JSONStore的load事件/insert,add方法应用 如何动态改变显示数据

1.场景/功能描述
1.1产品分类管理(增加,修改,删除,查询)
1.2产品查询界面,查询下拉条件有:产品分类。

2.分析
业务数据存储在数据库。界面显示时请求web服务器,再而从数据库中读取数据。
相同:场景中1.1查询所有产品分类与1.2加载所有产品分类作为条件,这两部分的数据集一样
不同:场景1.2的数据集需要多一项,“全部”,即用户可选“全部”项,查询所有分类的产品
3.实现
只描述关键代码

方法1:
前台:
Ext.Ajax.request({
extraParams:{'from':'1.1'}//from表示界面源,1.1表示场景1.1
});

后台:

IList<ProductCate> listCate = db.getList("select cateid,catename from tbProductCate ");//读取数据

string _from = Request.From["from"].ToString();
if( _from == "1.2")
{
listCate.insert(0,new ProductCate("-1","全部"));
}

Respone.Write(listCate.toJSON());
Respone.End();

方法2:
在场景1.2部分js代码中,在 productCateJsonStore增加load事件的监听。
var productCateJsonStore = new Ext.data.JSONStore(
...//其他配置简略
listeners : {
load : function()
{
this.insert(0,{cateid:-1,catename:'全部'});
//this.add({cateid:-1,catename:'全部'});是加载到最后面
}
}
);

方法3:
在场景1.2中将下拉框单选改为列表多选。

对比分析:
方法1:比较土,修改代码量少,扩展性中等。
方法2:实现当前需求最简单做法。
方法3:修改代码量大,但用户体验好。

4.扩展

在JSONStore的load事件里,可get某一条数据,然后修改某一项的值,或者remove


转自:http://blog.csdn.net/dafeng168/article/details/6650918

extjs4 treepanel动态改变行高度示例_extjs

extjs4 treepanel动态改变行高度示例_extjs

extjs4 treepanel动态改变行高度示例_extjs 
复制代码 代码如下:

//css代码

.x-row-class{
line-height:30px;
}

//js代码

},{
text: ''技能分配'',
flex: 1,
width:150,
dataIndex: ''skillDistribut'',
sortable: true,
renderer:function(value, metaData, record, rowIndex, columnIndex, store){
metaData.tdAttr= "data-qtip=''" + value + "''";
if (record.data.outboundAmount==1) {
metaData.tdCls=''x-grid-record-red'';
}
return value;
}
},{

关于Next.js - 使用 CSS 模块时无法应用动态类名css不生效的原因的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于angular – 在定位ECMAScript 2015模块时无法使用导入分配、css – ReactJS向手动类名添加动态类、extjs JSONStore的load事件/insert,add方法应用 如何动态改变显示数据、extjs4 treepanel动态改变行高度示例_extjs的相关信息,请在本站寻找。

本文标签:

上一篇如何使用 CSS 使一个元素缩小到某个点,然后一个兄弟元素缩小到某个点,然后将元素包裹起来?

下一篇无法使用脚本 ('domainname/firebase-messaging-sw.js') 为范围 ('domainname') 注册 ServiceWorker;在颤振网络上