0

这可能不是为什么有人想要将变量从一个 javascript 导出/导入到另一个的最佳示例,但希望它已经足够好了。

我有一个 javascript 文件,我在其中启动了一个变量,我们将这个变量称为 counter 和它所在的 javascript 文件CounterModel.js。我还有一个 javascript 文件,它实际上对我的计数器做了一些名为CounterController.js.

在我的 vue 文件中,我想启动我的计数器App.vue并在Counter.vue.

所以我在下面有这个设置,它给了我三个类似的警告,所以我一定做错了什么。所以我想问:

这里做错了什么?

输出

WARNING  Compiled with 3 warnings                                                                                                                                                    06:35:49

 warning  in ./src/App.vue?vue&type=script&lang=js&

"export 'default' (imported as 'counter') was not found in './api/CounterModel'

 warning  in ./src/components/counter/Counter.vue?vue&type=script&lang=js&

"export 'default' (imported as 'counterController') was not found in '../../api/CounterController'

 warning  in ./src/components/counter/Counter.vue?vue&type=script&lang=js&

"export 'default' (imported as 'counterController') was not found in '../../api/CounterController'

CounterModel.js

export let counter

async function initiateCounter () {
  counter = 0
}

module.exports = {
  initiateCounter
}

CounterController.js

import { counter } from './CounterModel'

async function incrementCounter () {
  counter++
}

async function getCounter () {
  return counter
}

module.exports = {
  incrementCounter,
  getCounter
}

应用程序.vue

<template>
<div>
      <router-view></router-view>
</div>
</template>

<script>

import counter from '~/api/CounterModel'

export default {
  name: 'App',
  async created () {
    await counter.initiateCounter()
  }
}

</script>

计数器.vue

<template>

<div>
      <button v-on:click="incrementCounter">Add 1</button>
    {{ counter }}
</div>
</template>

<script>
import counterController from '~/api/CounterController'

export default {
  name: 'Counter',
  data () {
    return {
      counter: null
    }
  },
  methods: {
    incrementCounter: async function () {
      counterController.incrementCounter()
    },
    getCounter: async function () {
      this.counter = counterController.getCounter()
    }
  },
  async created () {
    await this.getCounter()
  }
}
</script>
4

2 回答 2

1

首先,你不应该混淆 import/export 和 require/module.exports。import/export 是 ES6 语法,require/module.export 是 Commonjs 语法。

  1. 在 App.vue 中,如果您使用import counter from '~/api/CounterModel',这意味着您必须在 CounterModel.js 中将计数器导出为默认值

let counter=0; export default counter

否则,您可以使用import {counter} from '~/api/CounterModel'

  1. 同样的原因import counterController from '~/api/CounterController'。如果要在Counter.vue文件中使用 import,请在 CounterController.js 中使用 ES6 导出语法而不是 module.exports。

```

import { counter } from './CounterModel'

async function incrementCounter () {
  counter++
}

async function getCounter () {
  return counter
}

export incrementCounter;
export getCounter;

```

您还应该注意,您刚刚在此处导入的计数器实际上是不可编辑的。因为 ES6 将导入的值视为常量。如果您尝试修改,它将得到 typeError。但是可以在 CounterModel.js 中修改

于 2018-10-22T08:14:25.790 回答
0

我想补充一点,我遇到的最大问题是消除了我认为与在 javascript 文件中导出和导入计数器有关的最后一个警告,但实际上是关于在 vue 文件中导入计数器函数。发出警告。

这 ->import counter from '~/api/CounterModel'需要默认导出。

实际代码包含两个对象,一个“app.js”和一个“counter.js”,其中需要一个应用对象来修改“counter”。希望“app”永远不需要在它自己的文件之外进行任何修改。

所以我真正想要的是更接近这个:

应用程序.js

export let app

async function initialiseApp () {
  app = window.safe.initialiseApp()
}

export default {
  initialiseApp
}

计数器.js

import { app } from '~/api/safenetwork'

async function createCounter () {
  counter = await app.createCounter()
}

async function incrementCounter () {
  await counter.increment()
}

async function getCounter () {
  return counter
}

export default {
  createCounter,
  incrementCounter,
  getCounter
}
于 2018-10-22T19:22:52.487 回答