You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Devextreme内置主题在React应用中不生效,求排查方案

Devextreme内置主题在React应用中不生效的问题排查

问题现状

  • 使用Devextreme 23.1.3 + React框架,测试页面包含DataGrid,未引入本地SCSS/CSS文件
  • 在index.html中添加了以下主题引用:
<link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/23.1.5/css/dx.contrast.css" />
  • Chrome网络面板显示加载了以下文件,但页面未应用Darkmoon主题:
    • https://cdn3.devexpress.com/jslib/23.1.5/css/dx.darkmoon.css
    • https://fonts.googleapis.com/css?family=Roboto:300,400,500,700
    • https://fonts.googleapis.com/earlyaccess/notokufiarabic.css

测试页面代码如下:

import React, { useState, useEffect, useRef } from 'react';
import DataGrid, { HeaderFilter, Editing, Paging, Pager, FilterRow, SearchPanel, StateStoring, Column, Scrolling } from 'devextreme-react/data-grid';
import {stringify} from "flatted";
//import 'devextreme/dist/css/dx.light.css';
//import './meters.scss';

const MetersPage = () => {
  const [data, setData] = useState([]); // Manage the data state
  const [filterValues, setFilterValues] = useState("");
  const dataGridRef = useRef(null);

  /*
  const applyFilter = () => {
    let values = filterValues.replace(/\s+/g, "").split(',');
    if (dataGridRef.current) {
      dataGridRef.current.instance.columnOption("EXTNL_MTR_ID", "filterValues", values);
    }
  };

  const clearFilter = () => {
    setFilterValues(""); // Clear the filter values
    if (dataGridRef.current) {
      dataGridRef.current.instance.columnOption("EXTNL_MTR_ID", "filterValues", null);
    }
  };
*/

  const fetchData = () => {
    // Make an API call to fetch data from the Django backend
    fetch('https://vm-devmdms02/meters2/')
      .then((response) => response.json())
      .then((data) => setData(data))
      .catch((error) => {
        console.error(error);
      });
  };

  const handleSave = (changes: any) => {
    // Clone the changes object to avoid modifying the original object
    const clonedChanges = { ...changes };

    // Remove properties with circular references
    const serializedData = stringify(clonedChanges);

    // Make an API call to save the modified changes in the Django backend
    fetch('https://vm-devmdms02/meters2/', {
      method: 'POST',
      body: serializedData,
      headers: {
        'Content-Type': 'application/json',
      },
    })
      .then((response) => response.json())
      .then(() => {
        // On success, fetch updated data and refresh the grid
        fetchData();
      });
  };

  useEffect(() => {
    fetchData(); // Fetch data on component mount
  }, []);

  return (
  <div>
    < DataGrid
      ref={dataGridRef}
      dataSource={data} 
      showBorders={true} 
      remoteOperations={true}
      onSaving={handleSave}
    >
      <Editing
          mode="cell"
          allowAdding={true}
          allowUpdating={true}
          allowDeleting={true}
          useIcons={true}/>
        <FilterRow visible={true} />
        <HeaderFilter allowSearch={true} />
        <Column
          dataField='DMI_DEVICE'
          caption='DMI_DEVICE'
        />
        <Column
          dataField='EXTNL_MTR_ID'
          caption='EXTNL_MTR_ID'
        />
        <Column
          dataField='DEVICE_NAME'
          caption='DEVICE_NAME'
        />
        <Column
          dataField='EIS_DEV_TYPE'
          caption='EIS_DEV_TYPE'
        />

        <Column
          dataField='DMI_RCDR_SP_NM'
          caption='DMI_RCDR_SP_NM'
        />
        <Column
          dataField='DMI_DP_MDM'
          caption='DMI_DP_MDM'
        />
        <Column
          dataField='DMI_DP'
          caption='DMI_DP'
        />
        <Column
          dataField='DMI_MTR'
          caption='DMI_MTR'
        />
        <Column
          dataField='DMI_MTR_CFG'
          caption='DMI_MTR_CFG'
        />
        <SearchPanel visible={true}/>
        <Paging defaultPageSize={10} />
        <StateStoring enabled={true} type={"localStorage"}/>
        <Pager showPageSizeSelector={true} showInfo={true} />
      </ DataGrid>
    </ div>
  );
};

export default MetersPage;

错误点分析

  1. 版本不匹配:项目依赖的Devextreme是23.1.3,但CDN加载的样式文件是23.1.5版本,版本不一致会导致样式规则不兼容,无法正确应用主题。
  2. 主题引用错误:你想要应用Darkmoon主题,但index.html中引用的是dx.contrast.css,网络中出现的dx.darkmoon.css可能是被其他依赖自动引入,导致多个主题样式冲突,最终生效的不是目标主题。
  3. 潜在的默认主题引入:Devextreme React组件可能默认会引入基础主题(如light),如果多个主题文件同时加载,后加载的样式会覆盖先加载的,导致目标主题不生效。

解决步骤

  1. 统一版本:将index.html中的主题CDN链接版本改为23.1.3,与项目依赖版本一致,同时直接引用Darkmoon主题:
<link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/23.1.3/css/dx.darkmoon.css" />
  1. 清理多余主题:检查项目中是否有其他地方(如package.json依赖、配置文件)自动引入了其他主题,确保只保留目标主题的引用。
  2. 调整加载顺序:确保主题样式文件在Devextreme组件脚本之前加载,保证样式能优先应用到组件上。
  3. 清除浏览器缓存:Chrome的缓存可能保留了旧的样式文件,清除缓存后重新加载页面测试。

内容的提问来源于stack exchange,提问作者Gregory Williams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 17:57:03