动态风格大师:深入了解如何使用classnames与MobX6打造响应式UI

classnames 是一个常用的 JavaScript 第三方库,它用于方便地操作 DOM 的 class 字符串。在构建动态的、响应式的、以及具有复杂状态的 web 应用时,classnames 库提供了简单的 API 来条件性地组合不同的 class 名称。

  • 安装 📦

    在使用 classnames 前,需要先将其安装到你的项目中。可以使用 npmyarn 来完成安装:

    bash 复制代码
    npm install classnames

    或者

    bash 复制代码
    yarn add classnames
  • 基本用法 🔧

    一旦安装,就可以在项目中引入并使用它:

    javascript 复制代码
    import classNames from 'classnames';
    
    const buttonClass = classNames('btn', 'btn-primary', 'large');
    // 最终 buttonClass 的值为 'btn btn-primary large'
  • 条件性添加类名 ⚖️

    classnames 的一个主要功能是可以根据条件动态地添加或忽略类名。例如:

    javascript 复制代码
    import classNames from 'classnames';
    
    const Button = ({ isActive, isDisabled }) => {
      const buttonClass = classNames(
        'btn',
        { 'btn-active': isActive, 'btn-disabled': isDisabled }
      );
    
      return <button className={buttonClass}>Click me</button>;
    };
  • 与其他数据结构相结合 🧩

    classnames 也支持数组和对象以外的其他数据类型,如下所示:

    javascript 复制代码
    import classNames from 'classnames';
    
    const classes = classNames({
      'text-success': true,
      'text-error': false
    }, 'static-class', ['responsive-class']);
    
    // 最终 classes 的值为 'text-success static-class responsive-class'
  • 与 React 一起使用 ⚛️

    在 React 项目中,很容易和组件的 className 属性配合使用:

    javascript 复制代码
    import React from 'react';
    import classNames from 'classnames';
    
    const MyComponent = ({ additionalClass, isImportant }) => (
      <div className={classNames('my-component', additionalClass, { 'my-component-important': isImportant })}>
        This is a component content
      </div>
    );
    
    export default MyComponent;
  • 使用classnames和mobx赋能前端样式交互 🔄

    使用 classnamesMobX 结合通常是在已经有一个由 MobX 管理的状态并且需要根据这个状态来动态改变类名的场景。以下是 classnamesMobX 6 结合使用的一个简单示例:

    bash 复制代码
    npm install mobx mobx-react classnames
    javascript 复制代码
    import { makeAutoObservable } from 'mobx';
    
    class ToggleStore {
      buttonActive = false;
    
      constructor() {
        makeAutoObservable(this);
      }
    
      toggleButtonActive() {
        this.buttonActive = !this.buttonActive;
      }
    }
    
    const toggleStore = new ToggleStore();
    export default toggleStore;
    
    import React from 'react';
    import { observer } from 'mobx-react';
    import classNames from 'classnames';
    import toggleStore from './ToggleStore';
    
    const Button = observer(() => {
      const buttonClass = classNames('btn', {
        'btn-active': toggleStore.buttonActive
      });
    
      const handleButtonClick = () => {
        toggleStore.toggleButtonActive();
      };
    
      return (
        <button className={buttonClass} onClick={handleButtonClick}>
          {toggleStore.buttonActive ? 'Active' : 'Inactive'}
        </button>
      );
    });
    
    export default Button;
  • 结论

    classnames 是一个轻量级而有力的工具,它适用于动态构建 class 名称。适合在任何需要操作 class 名称的 JavaScript 或 React 项目中使用。


English version

  • Installation 📦

    Before using classnames, you need to install it into your project using either npm or yarn:

    bash 复制代码
    npm install classnames

    Or

    bash 复制代码
    yarn add classnames
  • Basic Usage 🔧

    Once installed, you can import and use it in your project:

    javascript 复制代码
    import classNames from 'classnames';
    
    const buttonClass = classNames('btn', 'btn-primary', 'large');
    // The final value of buttonClass will be 'btn btn-primary large'
  • Conditional Class Names ⚖️

    A major feature of classnames is its ability to dynamically add or ignore class names based on conditions. For example:

    javascript 复制代码
    import classNames from 'classnames';
    
    const Button = ({ isActive, isDisabled }) => {
      const buttonClass = classNames(
        'btn',
        { 'btn-active': isActive, 'btn-disabled': isDisabled }
      );
    
      return <button className={buttonClass}>Click me</button>;
    };
  • Combining with Other Data Structures 🧩

    classnames also supports data types other than arrays and objects, as shown below:

    javascript 复制代码
    import classNames from 'classnames';
    
    const classes = classNames({
      'text-success': true,
      'text-error': false
    }, 'static-class', ['responsive-class']);
    
    // The final value of classes will be 'text-success static-class responsive-class'
  • Use with React ⚛️

    In React projects, it is easy to combine with the className property of components:

    javascript 复制代码
    import React from 'react';
    import classNames from 'classnames';
    
    const MyComponent = ({ additionalClass, isImportant }) => (
      <div className={classNames('my-component', additionalClass, { 'my-component-important': isImportant })}>
        This is a component content
      </div>
    );
    
    export default MyComponent;
  • Combining classnames with MobX for Front-End Style Interaction 🔄

    Combining classnames with MobX is common in scenarios where you already have a state managed by MobX and need to dynamically change class names based on this state. Here is a simple example of using classnames with MobX 6:

    bash 复制代码
    npm install mobx mobx-react classnames
    javascript 复制代码
    import { makeAutoObservable } from 'mobx';
    
    class ToggleStore {
      buttonActive = false;
    
      constructor() {
        makeAutoObservable(this);
      }
    
      toggleButtonActive() {
        this.buttonActive = !this.buttonActive;
      }
    }
    
    const toggleStore = new ToggleStore();
    export default toggleStore;
    
    import React from 'react';
    import { observer } from 'mobx-react';
    import classNames from 'classnames';
    import toggleStore from './ToggleStore';
    
    const Button = observer(() => {
      const buttonClass = classNames('btn', {
        'btn-active': toggleStore.buttonActive
      });
    
      const handleButtonClick = () => {
        toggleStore.toggleButtonActive();
      };
    
      return (
        <button className={buttonClass} onClick={handleButtonClick}>
          {toggleStore.buttonActive ? 'Active' : 'Inactive'}
        </button>
      );
    });
    
    export default Button;
  • Conclusion

    classnames is a lightweight yet powerful tool suitable for dynamically constructing class names. It offers a clear and concise syntax, enhancing the development experience and the neatness of the outcome, making it a great choice for any JavaScript or React project involving class name manipulation.

相关推荐
Sarvartha4 分钟前
三目运算符
linux·服务器·前端
晓晨的博客11 分钟前
ROS1录制的bag包转换为ROS2格式
前端·chrome
Wect19 分钟前
LeetCode 72. 编辑距离:动态规划经典题解
前端·算法·typescript
donecoding32 分钟前
别再让 pnpm 跟着 nvm 跑了!独立安装终极指南
前端·node.js·前端工程化
GISer_Jing34 分钟前
AI全栈转型_TS后端学习路线
前端·人工智能·后端·学习
竹林81834 分钟前
被The Graph的GraphQL查询坑了三天,我用一个真实DeFi项目把链上数据索引彻底搞懂了
前端·graphql
漫游的渔夫35 分钟前
前端开发者做 Agent:别只会执行,用 4 类失败策略让 AI 知道怎么停
前端·人工智能·typescript
用户0595401744637 分钟前
把多级缓存一致性验证从手工测试换成 Pytest 参数化,Bug 排查时间缩短 90%
前端·css
暗不需求39 分钟前
深入理解 LangChain:AI 应用开发框架的工程化实践
前端·langchain
用户059540174461 小时前
把 Redis 持久化测试从 800 行 Shell 换成 30 行 pytest,排错效率翻了 10 倍
前端·css