.vue文件的export default能替换为新建的vue对象吗?怎样转换?或者,新建vue对象的代码,怎样转换为export default形式?
用vue-cli的webpack建立的项目,自带了根组件App.vue和components/Hello.vue子组件,以及入口文件main.js和index.html。作为组件存在的.vue文件的标签内,通常会这样写:
export default {
data () {
return {
some_data: 'this is some data',
another_items: ['this', 'is', 'another', 'data']
}
},
methods: {
actionOne () {
// do sth
},
actionTwo () {
// do another thing
}
},
...
}
但有时候一些代码实例往往是会新建一个Vue对象的,甚至多个Vue对象,比如我想在vuejs中使用CodeMirror代码高亮库,找到的参考代码(这里只贴了vue里面的js代码,html和css见http://codepen.io/royportas/pen/XKXXzv/)
var model = {
text: '',
stats: {
words: 0,
chars: 0
}
};
var TallyComponent = Vue.extend({
template: "#tally",
data: function() {
return {
model: model
}
},
computed: {
words: function() {
return this.model.text.split(' ').length - 1;
},
chars: function() {
return this.model.text.length;
},
lastChar: function() {
return this.model.text[this.model.text.length - 1];
}
}
});
Vue.component('tally', TallyComponent);
var app = new Vue({
el: '#app',
data: function() {
return {
model: model,
editor: null
}
},
created: function() {
var scope = this;
this.editor = CodeMirror.fromTextArea(document.getElementById('editor'), {
lineNumbers: true
});
this.editor.on('change', function(cm) {
scope.model.text = cm.getValue();
});
}
});
这个时候有几个疑问:
.vue组件文件内定义vue对象合适吗?export default出来一个对象,似乎是官方倾向使用的方式?
我怎样把上面的代码,转换为export default的形式?
======更新======
现在问题还是没有解决,vue-cli的webpack模版建立项目,目录结构和用到的文件(红框标出):

index.html
rsite
src/main.js
import Vue from 'vue'
import App from './App'
/* eslint-disable no-new */
new Vue({
el: 'body',
components: { App }
})
src/App.vue
CodeMirror Example
{{model.text}}
Editor Pane
src/components/tally.vue
Total words: {{words}}
Total chars: {{chars}}
Last character: {{lastChar}}
现在的问题:页面是空白,报错提示:

如果去掉App.vue里面的这两句:
import CodeMirror from 'codemirror'
,
created () {
var scope = this
this.editor = CodeMirror.fromTextArea(document.getElementById('editor'), {
lineNumbers: true
})
this.editor.on('change', function (cm) {
scope.model.text = cm.getValue()
})
}
那么页面就正常显示了,但是这明显没有使用到codemirror
我觉得codepen.io上那个例子过于麻烦了,我其实最需要的就是代码实时高亮,也就是在里面输入后立即看到高亮过的代码。所以现在写成这样了:
index.html
index.html中定义
main.js:
import Vue from 'vue'
import App from './App.vue'
/* eslint-disable no-new */
new Vue({
el: 'body',
components: {
App
}
})
App.vue
通过app.vue定义
结果截图:

很明显,通过组件App.vue编写的代码高亮区域并没有高亮,但是两个对比的区域代码几乎是一直的,区别仅仅在于写法的问题。该如何修改?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
webpack开发形式中,完全不需要New,每个组件都会被loader自动重载为实例或组件对象;
这一步在ng2中是以ES7装饰器形式实现的,vue中是loader实现的。
我是看了你提的其他几个问题,觉得开发方式不太对,Webpack开发模式中尽量不要按照Browers端开发模式去走了
一个入口文件实例:
针对这个问题,研究了一下,写了个扩展
npm:https://www.npmjs.com/package...
Github:https://github.com/surmon-chi...
使用方法
1:
npm install vue-codemirror2:依赖:
3:组件中使用
一般全局都应该是一个vue实例实例吧,我觉着,等等看看别人的回答
可以定义,但一般不会作为程序入口,可能只是某个事件总线或什么东西(但也会单独拿出来).
tally-component.vue
app.js
app.html
update:是不是textarea的v-model影响了codeMirror,去掉试试
vue的模块化就是在参数那一层去做的,你没必要在每个组件里去实例化vue对象,只在最外层,也就是脚手架工具的main.js里做一次实例化,接下来都是这个组件的参数。
你的代码里,我觉得Vue.extend可以做一个父类,放在一个单文件组件里,script标签就是extend内部的参数对象。
app是你扩展以后Vue类的一个实例化组件,继承了Vue.extend里提供的方法。
但是我看TallyComponent里的内容好像不像是需要扩展到Vue类里的,本身可以理解为一个组件,而app看起来像是入口组件。所以你应该先搞清楚这个TallyComponent以及app组件之间的关系,如果TallyComponent只是一个组件,它就是一个单文件*.vue组件,app那个new vue就可以放在入口的main.js里。
问题很明显,应当在 ready 中初始化 cm 。你在 created 中初始化它,此时 vue 的 dom 还没有插入到页面,自然是报错了。
至于.vue 的写法,只是更好的组件书写方式,编译后生成的 js,和用 js 直接写一个组件没有什么不同。在这里没有高亮的问题,只是因为你没有引入 cm 的主题 css 和 mode 的 js。import cm 只是引入了 cm 的内核,要渲染什么语言,还要引入对应的 mode 脚本。
单页上应该只有一个 new vue 对象,用于挂载应用,其他的都应当作为组件应用