一个jsx文件

var Modal = require("pokeball/components/modal");
// var CommonDatepicker = require("extras/common_datepicker");
require("common/move_animate/extend");
var here, cpuChartOption;

class hostInfo_manage {
    constructor() {
        here = this;



        // 下拉搜索选择框初始化
        $('.search-select').searchableSelect();

        // 初始化分页
        $("#host-overview-page").pagination({
            firstBtnText: "首页",
            lastBtnText: "末页",
            prevBtnText: "上一页",
            nextBtnText: "下一页",
            showInfo: true,
            infoFormat: "共{total}页",
            pageElementSort: ['$page', '$size', '$info', '$jump'],
            showJump: true,
            showPageSizes: true,
            pageSizeItems: [5, 10, 25, 50],
            pageSize: 10,
            total: 100
        });

        

        cpuChartOption = {
            title: {
                text: 'CPU使用率',
                subtext: ''
            },
            tooltip: {
                trigger: 'axis',
                formatter: function(params) {
                    return "系统使用率: " + params[0].value + "%" + "<br>" + "用户使用率: " + params[1].value + "%";
                }
            },
            legend: {
                data:['系统使用率','用户使用率']
            },
            toolbox: {
                show: true
            },
            xAxis:  {
                type: 'category',
                boundaryGap: false,
                data: ['14:00','14:05','14:10','14:15','14:20','14:25','14:30','14:35','14:40','14:45','14:50','14:55','15:00']
            },
            yAxis: {
                type: 'value',
                boundaryGap: [0, '100%'],
                axisLabel: {
                    formatter: '{value} %'
                }
            },
            series: [
                {
                    name:'系统使用率',
                    type:'line',
                    areaStyle: {normal: {}},
                    data:[11, 11, 15, 13, 12, 13, 10, 11, 14, 15, 12, 5, 6]
                },
                {
                    name:'用户使用率',
                    type:'line',
                    areaStyle: {normal: {}},
                    data:[1, 2, 2, 5, 3, 2, 3, 5, 6, 7, 8, 7, 5]
                }
            ]
        };

        // 初始化图表
        var panelBodyWidth = Math.floor($(".main-right .panel-body").width());
        var cpuChartWidth = Math.floor(panelBodyWidth / 2);
        var cpuChartWidth2 = panelBodyWidth - cpuChartWidth;

        here.initChart("cpu-chart", cpuChartOption, cpuChartWidth, 300);
        here.initChart("cpu-chart2", cpuChartOption, cpuChartWidth2, 300);

        







        here.initDateTimePicker("#start-time-info", "#end-time-info");
        here.initDateTimePicker("#start-time-serious", "#end-time-serious");
        here.initDateTimePicker("#start-time-error", "#end-time-error");
        here.initDateTimePicker("#start-time-warn", "#end-time-warn");
        here.bindEvent();

    }

    // 初始化时间选择框
    initDateTimePicker(s, e) {
        jQuery.datetimepicker.setLocale('ch');
        jQuery(function(){
            jQuery(s).datetimepicker({
                format: 'Y-m-d H:i',
                onShow:function( ct ){
                    this.setOptions({
                        maxDate: jQuery(e).val()?jQuery(e).val():new Date(),
                    });
                },
                validateOnBlur:false,
                onChangeDateTime: function(current_time,$input) {
                    var endTime = new Date($(e).val());
                    if(current_time > new Date() || current_time > endTime) {
                        $(s).val("");
                        Messenger().post({
                            message: '开始时间大于当前时间或结束时间,请重新选择!',
                            type: 'error',
                            showCloseButton: true,
                            hideAfter: 2
                        });
                        Messenger({
                            extraClasses: 'messenger-fixed messenger-on-top'
                        });
                    }
                }
            });
            jQuery(e).datetimepicker({
                format: 'Y-m-d H:i',
                onShow:function( ct ){
                    this.setOptions({
                        minDate: jQuery(s).val()?jQuery(s).val():false,
                        maxDate: new Date()
                    });
                },
                validateOnBlur:false,
                onChangeDateTime: function(current_time,$input) {
                    var startTime = new Date($(s).val());
                    if(current_time > new Date() || current_time < startTime) {
                        $(e).val("");
                        Messenger().post({
                            message: '结束时间大于当前时间或小于开始时间,请重新选择!',
                            type: 'error',
                            showCloseButton: true,
                            hideAfter: 2
                        });
                        Messenger({
                            extraClasses: 'messenger-fixed messenger-on-top'
                        });
                    }
                }
            });
        });
    }
    // 初始化图表
    initChart(e, o, w, h) {
        var cpuChartElement = document.getElementById(e);
        $(cpuChartElement).css("width", w).css("height", h);
        var cpuChart = echarts.init(cpuChartElement);
        cpuChart.setOption(o);
    }

    //时间戳转换成24小时格式(2017-01-12 22:03:00)
    // formatTime(t) {
    //     console.log(t);
    //     var timeStr = new Date(t).toLocaleString();
    //     var arr1 = timeStr.split(" ");
    //     var arr2 = arr1[0].split("/");
    //     for(var i = 1; i <= 2; i++) {
    //         if(parseInt(arr2[i], 10) < 10) {
    //             arr2[i] = "0" + arr2[i];
    //         }
    //     }
    //     var str1 = arr2.join("-");
    //     var arr3 = arr1[1].split(":");
    //     if(arr3[0].indexOf("上午") !== -1) {
    //         if(parseInt(arr3[0].replace(/上午/g, ""), 10) < 10) {
    //             arr3[0] = "0" + arr3[0].replace(/上午/g, "");
    //         } else {
    //             arr3[0] = arr3[0].replace(/上午/g, "");
    //         } 
    //     }
    //     if(arr3[0].indexOf("下午") !== -1) {
    //         arr3[0] = (12 + parseInt(arr3[0].replace(/下午/g, ""), 10)).toString();
    //     }
    //     var str2 = arr3.join(":");
    //     return str1 + " " + str2;
    // }

    bindEvent() {
        // 浏览器窗口大小改变重新渲染图表
        $(window).resize(function() {

            $("#cpu-chart, #cpu-chart2").empty();

            var panelBodyWidth = Math.floor($(".main-right .panel-body").width());
            var cpuChartWidth = Math.floor(panelBodyWidth / 2);
            
            here.initChart("cpu-chart", cpuChartOption, cpuChartWidth, 300);
            var cpuChartWidth2 = panelBodyWidth - cpuChartWidth;
            here.initChart("cpu-chart2", cpuChartOption, cpuChartWidth2, 300);
        });

        $("body").off().on("click", "#create-option-btn", function() {
            var createOptionModal = new Modal("#create-warning-option");
            createOptionModal.show();
        })
        .on("click", "#top-nav a", function() {
            var index = $(this).closest("li").index();
            $("#top-nav li").removeClass("active");
            $("#top-nav li").eq(index).addClass("active");
            $(".content-block").hide().eq(index).show();
        })
        .on("click", "#add-warning-option", function() {
            var elemStr = `<tr>
                                <td id="hosts">
                                    <select>
                                        <option value="1">host1</option>
                                        <option value="2">host2</option>
                                        <option value="3">host3</option>
                                    </select>
                                </td>
                                <td id="options">
                                    <select>
                                        <option value="1">CPU使用率</option>
                                        <option value="2">内存使用率</option>
                                        <option value="3">交换区使用率</option>
                                        <option value="4">...</option>
                                    </select>
                                </td>
                                <td id="operation">
                                    <select>
                                        <option value="1">></option>
                                        <option value="2"><</option>
                                        <option value="3">>=</option>
                                        <option value="4"><=</option>
                                        <option value="5">!=</option>
                                    </select>
                                </td>
                                <td><input type="text" value="50%" class="small-input"></td>
                                <td><input type="text" value="70%" class="small-input"></td>
                                <td><input type="text" value="xxxxxxxxxxxx"></td>
                                <td><a href="javascript:;" class="delete-option">删除</a></td>
                            </tr>`;
            $("#create-warning-option tbody").append(elemStr);
        })
        .on("click", ".delete-option", function() {
            $(this).closest("tr").remove();
        })
        .on("click", "#next-step-1, #next-1", function() {
            $("#create-warning-option, #set-warning-option").hide();
            var createOptionModal = new Modal("#set-notice-person");
            createOptionModal.show();
        })
        .on("click", "#select-all-group", function() {
            $("#group-block").find("li").addClass("checked-blue").find("i").removeClass("hide");
        })
        .on("click", "#create-warning-group", function() {
            var warningGroupManage = new Modal("#warning-group-manage");
            warningGroupManage.show();
        })
        .on("click", "#add", function() {
            var usablePerson = $(".usable-person li");
            var usedPersonUl = $(".used-person ul");
            var checkedUsablePerson = $(".usable-person li i:not(.hide)");
            var len = checkedUsablePerson.length;
            var arr = [];
            var indexs = [];

            for(var i = 0; i < len; i++) {
                var index = checkedUsablePerson.eq(i).closest("li").index();
                indexs.push(index);
                arr.push(checkedUsablePerson.eq(i).closest("li").text());
            }
            for(var i = 0; i < indexs.length; i++) {
                usedPersonUl.append("<li>" + arr[i] + "<i class='fa fa-check pull-right checked-blue hide' aria-hidden='true'></i></li>");
                usablePerson.eq(indexs[i]).closest("li").remove();
            }
        })
        .on("click", "#remove", function() {
            var usedPerson = $(".used-person li");
            var usablePersonUl = $(".usable-person ul");
            var checkedUsedPerson = $(".used-person li i:not(.hide)");
            var len = checkedUsedPerson.length;
            var arr = [];
            var indexs = [];

            for(var i = 0; i < len; i++) {
                var index = checkedUsedPerson.eq(i).closest("li").index();
                indexs.push(index);
                arr.push(checkedUsedPerson.eq(i).closest("li").text());
            }
            for(var i = 0; i < indexs.length; i++) {
                usablePersonUl.append("<li>" + arr[i] + "<i class='fa fa-check pull-right checked-blue hide' aria-hidden='true'></i></li>");
                usedPerson.eq(indexs[i]).closest("li").remove();
            }
        })
        .on("click", ".person-block li", function() {
            $(this).toggleClass("checked-blue").find("i").toggleClass("hide");
        })
        .on("click", "#select-all-usable-person, #select-all-used-person", function() {
            $(this).next(".person-block").find("li").addClass("checked-blue").find("i").removeClass("hide");
        })
        .on("click", "#group-block li", function() {
            $(this).toggleClass("checked-blue").find("i").toggleClass("hide");
        })
        .on("click", ".setOption", function() {
            var setOptionModal = new Modal("#set-warning-option");
            setOptionModal.show();
            $("#set-warning-option > div").hide();
            $("#option-step-1").show();
        })
        .on("click", "#add-new-option", function() {
            var elemStr = `<tr>
                                <td id="hosts-option">
                                    <select>
                                        <option value="1">host1</option>
                                        <option value="2">host2</option>
                                        <option value="3">host3</option>
                                    </select>
                                </td>
                                <td id="options-option">
                                    <select>
                                        <option value="1">CPU使用率</option>
                                        <option value="2">内存使用率</option>
                                        <option value="3">交换区使用率</option>
                                        <option value="4">...</option>
                                    </select>
                                </td>
                                <td id="operation-option">
                                    <select>
                                        <option value="1">></option>
                                        <option value="2"><</option>
                                        <option value="3">>=</option>
                                        <option value="4"><=</option>
                                        <option value="5">!=</option>
                                    </select>
                                </td>
                                <td><input type="text" value="50%" class="small-input"></td>
                                <td><input type="text" value="70%" class="small-input"></td>
                                <td><input type="text" value="xxx"></td>
                                <td><input type="text" value="xxxxxxxxxxxx"></td>
                                <td><a href="javascript:;" class="delete-option">删除</a></td>
                            </tr>`;
            $("#set-warning-option tbody").append(elemStr);
        })
        .on("click", "#create-new-group", function() {
            var warningGroupManage = new Modal("#warning-group-manage");
            warningGroupManage.show();
        })
        .on("click", ".prompt", function() {
            var history = new Modal("#history-logs-info");
            history.show();
        })
        .on("click", "#search-history-info", function() {
            console.log($("#start-time-info").val(), $("#end-time-info").val());
        })
        .on("click", ".serious", function() {
            var history = new Modal("#history-logs-serious");
            history.show();
        })
        .on("click", "#search-history-serious", function() {
            console.log($("#start-time-serious").val(), $("#end-time-serious").val());
        })
        .on("click", ".errors", function() {
            var history = new Modal("#history-logs-error");
            history.show();
        })
        .on("click", "#search-history-error", function() {
            console.log($("#start-time-error").val(), $("#end-time-error").val());
        })
        // .on("click", ".search-select > input[type='text']", function() {
        //     $(this).next(".select-block").show();
        // })
        // .on("click", ".select-block li", function() {
        //     $(this).closest(".select-block").hide();
        // })
        .on("click", "#warning-info-search", function() {
            console.log($(this).closest("form").find(".searchable-select-item.selected").eq(0).data("value"));
        })
        .on("click", "#next-step-2", function() {
            $("#set-notice-person").hide();
            var finish = new Modal("#finish");
            finish.show();
        })

        


    }

    // getScreenHeight() {
    //     var height = parseInt($('.main-left').css('height')) - 210 + 'px';
    //     $("#left-tree.tree-panel").css('height', height);
    // }
    // moveAnimate() {
    //     var str = '#export-modal .modal-header, #history-detail-modal .modal-header, #history-trend .modal-header, #selectPeriodModal .modal-header';
    //     $(str).moveAnimate({
    //         modalHeaders: str
    //     });
    // }
}
module.exports = hostInfo_manage;










<think>好的,用户问的是“一个jsx文件可以有多个 export default 吗”。首先,我需要回忆一下JavaScript模块系统的基本规则。在ES6模块中,每个文件只能有一个默认导出(export default),这是标准的规定,因为默认导出代表整个模块的主入口。如果有多个默认导出的话,会导致导入时无法确定引用哪个,从而引发错误。 接下来,用户可能是在使用React的JSX文件,这种情况下,通常每个组件会单独放在一个文件中,并且使用export default来导出组件。但有时候用户可能尝试在一个文件中定义多个组件,或者混合导出其他内容,比如工具函数或者配置对象,这时候可能会不小心写多个export default。 然后,我需要考虑用户为什么会提出这个问题。可能的场景是用户在一个jsx文件中编写了多个组件,或者试图导出多个默认值,导致出现语法错误。用户可能对模块导出的规则不太熟悉,或者混淆了默认导出和命名导出的区别。 另外,用户可能希望在一个文件中组织多个相关的组件,比如在一个UI模块中包含多个子组件,这时候正确的做法是使用命名导出(export)来导出其他组件,而保留一个默认导出作为主组件。需要向用户解释这种模式,并给出示例代码,说明如何正确导出和导入多个组件。 还需要提醒用户常见的错误情况,比如重复使用export default会导致构建工具(如Webpack或Babel)报错,具体的错误信息可能是什么样子的,这样用户在遇到时可以识别问题所在。 同时,用户可能对模块导入的方式有疑问,比如如何导入默认导出和命名导出。这时候需要给出导入的示例,比如使用import MainComponent, { SubComponent1, SubComponent2 } from './file.jsx'; 这样的语法。 最后,总结最佳实践,建议用户每个文件一个默认导出,结合命名导出管理其他内容,保持代码的可维护性和清晰结构。可能还需要提到一些社区常见的模式,比如将多个相关的小组件放在一个文件中,通过命名导出方便复用。</think>不能。根据JavaScript模块规范,一个JSX/JS文件**只能有一个`export default`**,但可以配合多个**命名导出**使用。以下是完整解决方案: ```jsx // ✅ 正确用法:1个默认导出 + 多个命名导出 const MainComponent = () => <div>主组件</div>; // 命名导出组件 export const SubComponent1 = () => <div>子组件1</div>; export const SubComponent2 = () => <div>子组件2</div>; // 默认导出必须唯一 export default MainComponent; ``` **模块导入的正确方式**: ```jsx // 导入默认导出 import MainComponent from './MyComponent'; // 导入命名导出(需要解构) import { SubComponent1, SubComponent2 } from './MyComponent'; // 组合导入方式 import MainComponent, { SubComponent1 } from './MyComponent'; ``` **常见错误分析**: ```jsx // ❌ 错误示例:重复默认导出 export default function CompA() {...} export default function CompB() {...} // 报错:Duplicate export of 'default' ``` **模块系统对比表**: | 特性 | 默认导出 (`export default`) | 命名导出 (`export`) | |----------------|---------------------------|--------------------| | 导出数量限制 | 每个文件仅限1个 | 不限数量 | | 导入语法 | `import X from 'file'` | `import {X} from 'file'` | | 重命名灵活性 | 导入时可任意命名 | 必须使用导出时的名称 | | 主要用途 | 导出模块主要功能 | 导出辅助功能/子组件 | **最佳实践建议**: 1. **单一职责原则**:建议每个JSX文件只包含1个主要组件 2. **混合使用场景**: ```jsx // 页面组件模式 (Page Component Pattern) export default function UserPage() { // 默认导出页面组件 return ( <> <UserProfile /> <UserHistory /> </> ) } // 命名导出子组件 export function UserProfile() {...} export function UserHistory() {...} ``` 3. **TypeScript用户增强方案**: ```tsx // 使用interface统一导出类型 export interface User { id: string name: string } // 默认导出组件 export default function UserCard({ user }: { user: User }) { return <div>{user.name}</div> } ``` **构建工具兼容性**: - Webpack/Rollup:严格遵循ES模块规范,多默认导出会触发编译错误 - Babel配置:需确保`@babel/preset-env`正确设置`modules: false` - Next.js:在SSR场景下会自动检测重复默认导出问题 **常见错误处理**: ```bash # 典型报错信息 SyntaxError: Duplicate export 'default' (12:0) ``` 解决方案:检查文件中的`export default`出现次数,确保唯一性 **代码组织扩展方案**: ```jsx // 聚合导出模式 (index.js统一导出) // components/User/index.js export { default } from './UserCard' // 默认导出主组件 export * from './UserProfile' // 批量导出子组件 export * from './UserHistory' // 批量导出工具函数 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值