关于如何在 vue 中使用 js 数据和方法 export、export default、module.exports

本文详细介绍了JavaScript中的export、export default和module.exports三种导出方式,以及在Vue中如何导入和使用这些导出的功能。export default用于单一默认导出,而export则可以导出多个函数或变量。在Vue组件中,根据导出方式的不同,引入时的语法也有所区别。module.exports则是CommonJS模块中导出的方法,允许导出一个包含多个属性的对象。在实际开发中,理解这些模块系统对于有效组织和复用代码至关重要。

export

在 js 中

export function test1Fn1() {
  let list = [
    {
      id: 1,
      name: "1111",
    },
    {
      id: 2,
      name: "2222",
    },
    {
      id: 3,
      name: "3333",
    },
  ];
  return list;
}
export function test1Fn2() {
  let list = [
    {
      id: 1,
      age: 20,
    },
    {
      id: 2,
      age: 21,
    },
    {
      id: 3,
      age: 22,
    },
  ];
  return list;
}

在 vue 中

<template>
  <div class="container"></div>
</template>
<script>
import test1 from "./Test1";
import { test1Fn1, test1Fn2 } from "./Test1";
export default {
  name: "test", // Test
  mixins: [],
  components: {},
  props: {},
  data() {
    return {
      list: test1Fn1(),
    };
  },
  computed: {},
  watch: {},
  created() {
    console.log(test1);
    console.log(this.list);
    console.log(test1Fn2());
  },
  mounted() {},
  destroyed() {},
  methods: {},
};
</script>

在这里插入图片描述

export 只是 向外面暴露一个一个函数,在 vue 中引入该 js 时,要指定引用的具体函数名。
所以不可以使用 import test1 from "./Test1" 引用
而是 import { test1Fn1, test1Fn2 } from "./Test1"
花括号里面,是 js 的函数,获取的数据,就是该函数 return 出来的数据。

export default

在 js 中

export default {
  list1: [
    {
      id: 1,
      name: "1111",
    },
    {
      id: 2,
      name: "2222",
    },
    {
      id: 3,
      name: "3333",
    },
  ],
  list2: [
    {
      id: 1,
      age: 20,
    },
    {
      id: 2,
      age: 21,
    },
    {
      id: 3,
      age: 22,
    },
  ],
   test2Fn1: () => {
    return "1234";
  },
};

在 vue 中

<script>
import test2 from "./Test2";
export default {
  name: "test", // Test
  mixins: [],
  components: {},
  props: {},
  data() {
    return {};
  },
  computed: {},
  watch: {},
  created() {
    console.log(test2);
    console.log(test2.list1);
    console.log(test2.list2);
    console.log(test2.test2Fn1());
  },
  mounted() {},
  destroyed() {},
  methods: {},
};
</script>

在这里插入图片描述

export default 默认导出一个对象,对象的每一项可以是数组函数等。一个js 只能有一个 export default
在 vue 中引入该 js 时,import test2 from "./Test2";
访问对象的属性或调用函数,直接 test2.list1test2.test2Fn1()

module.exports

在 js 中

const fn1 = () => {
  const list1 = [
    {
      id: 1,
      name: "1111",
    },
    {
      id: 2,
      name: "2222",
    },
    {
      id: 3,
      name: "3333",
    },
  ];
  return list1;
};
const fn2 = function() {
  const list2 = [
    {
      id: 1,
      age: 20,
    },
    {
      id: 2,
      age: 21,
    },
    {
      id: 3,
      age: 22,
    },
  ];
  return list2;
};
module.exports = {
  test3Fn1: fn1,
  test3Fn2: fn2,
};
// 也可以不重新命名
// module.exports = {
//   fn1,
//   fn2,
// };

在 vue 中

<script>
import test3 from "./Test3";
export default {
  name: "test", // Test
  mixins: [],
  components: {},
  props: {},
  data() {
    return {};
  },
  computed: {},
  watch: {},
  created() {
    console.log(test3);
    console.log(test3.test3Fn1());
    console.log(test3.test3Fn2());
  },
  mounted() {},
  destroyed() {},
  methods: {},
};
</script>

在这里插入图片描述
module.export 相当于集中起来导出去,导出的为一个对象,在 vue 中直接访问使用即可。

exportexport defaultmodule.exports 只是 js 不同的导出方式

### 解决 Vue 封装 el-tabs 公共组件时的 `export default` 报错问题 在 Vue 中封装公共组件时,如果遇到 `A module cannot have multiple default exports` 的报错,通常是由于在同一模块中多次使用了 `export default` 语句[^1]。Vue 模块只允许一个默认导出(default export),因此需要确保每个文件中只有一个 `export default`。 以下是解决此问题并实现页面切换父组件传递数据功能的具体方法: #### 1. 避免多次 `export default` 确保组件文件中只有一个 `export default` 语句。例如,在封装 Tabs 组件时,应将所有逻辑集中在一个对象中进行导出: ```javascript export default { name: 'CustomTabs', props: { tabsData: { type: Array, required: true, }, activeTab: { type: String, default: '', }, }, data() { return { activeName: this.activeTab || this.tabsData[0]?.name, }; }, methods: { handleTabClick(tab) { this.$emit('tab-change', tab.name); }, }, }; ``` 如果需要额外导出其他内容(如子组件或工具函数),可以使用命名导出(named export): ```javascript export const utils = { resolveComponent: (componentName) => componentName, }; export default { // 主组件逻辑 }; ``` #### 2. 实现页面切换功能 通过监听 `el-tabs` 的 `@tab-click` 事件,触发页面切换逻辑。以下是一个完整的示例: ```vue <template> <el-tabs v-model="activeName" @tab-click="handleTabClick"> <el-tab-pane v-for="tab in tabs" :key="tab.name" :label="tab.label" :name="tab.name" > <component :is="resolveComponent(tab.component)" /> </el-tab-pane> </el-tabs> </template> <script> import { resolveComponent } from './utils'; export default { props: { tabsData: { type: Array, required: true, }, activeTab: { type: String, default: '', }, }, data() { return { activeName: this.activeTab || this.tabsData[0]?.name, tabs: this.tabsData, }; }, methods: { handleTabClick(tab) { this.$emit('tab-change', tab.name); }, resolveComponent(componentName) { return resolveComponent(componentName); }, }, }; </script> ``` #### 3. 父组件传入数据 父组件可以通过 `tabsData` `activeTab` 属性向封装的 Tabs 组件传递数据。例如: ```vue <template> <custom-tabs :tabs-data="tabs" :active-tab="activeTab" @tab-change="handleTabChange" /> </template> <script> import CustomTable1 from './components/CustomTable1.vue'; import CustomTable2 from './components/CustomTable2.vue'; export default { components: { CustomTable1, CustomTable2, }, data() { return { tabs: [ { label: '页面1', name: 'firstTab', component: 'CustomTable1' }, { label: '页面2', name: 'secondTab', component: 'CustomTable2' }, ], activeTab: 'firstTab', }; }, methods: { handleTabChange(activeName) { console.log('当前选中的 Tab:', activeName); this.activeTab = activeName; }, }, }; </script> ``` #### 4. 动态加载组件 为了优化性能,可以结合 Vue 的异步组件功能动态加载 Tab 内容[^2]: ```javascript resolveComponent: (componentName) => () => import(`../components/${componentName}.vue`), ``` 然后在模板中使用: ```vue <component :is="resolveComponent(tab.component)" /> ``` ####
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值