1、看官方挨批文档,安装相应工具
cnpm install vue //安装vue包
cnpm install --global vue-cli //安装cli编译工具
2、创建一个基于 webpack 模板的新项目
vue init webpack my-project ( vue init webpack-simple my-project 初学者建议使用这个初始构建项目,本文所讲例子是基于webpack-simple构建的)$ cd my-project$ cnpm install$ npm run dev (开发环境下运行项目,会在浏览器打开)npm run build (打包编译正式环境下面的文件,会在项目文件夹下面生成index.html,dist文件夹,dist文件夹下面有静态资源和build.js文件。直接拷贝这些文件到你的web服务器,然后在web服务器访问index.html,即可看到开发调试看到的界面)
3、创建组件
在工程目录 /src 下创建 component 文件夹,并在 component 文件夹下创建一个 firstcomponent.vue 并写仿照 App.vue 的格式和前面学到的知识写一个组件。
<template>
<div id="firstcomponent">
<h1>I am a title.</h1>
<a> written by {{ author }} </a>
</div>
</template>
<script type="text/javascript">
export default {
data () {
return {
author: "刘小强,qq号 940235644"
}
}
}
</script>
<style>
</style>
4、在 App.vue 使用组件 ( 因为在 index.html 里面定义了<div id="app"></div>所以就以这个组件作为主入口,你可以自己尝试改写)
第一步,在App.vue引入。在 <script></script> 标签内的第一行写
import firstcomponent from './component/firstcomponent.vue'
第二步,在App.vue注册。在 <script></script> 标签内的 data 代码块后面加上 components: { firstcomponent }。这里要注意:如果你还有其他组件要使用,必须和firstcomponent一样在App.vue里面引入和注册components: { firstcomponent ,secondcomponent}
export default {
data () {
return {
msg: 'Hello Vue!'
}
},
components: { firstcomponent }
}
第三步,使用。
在 <template></template> 内加上<firstcomponent></firstcomponent>
<template>
<div id="app">
<img src="./assets/logo.png">
<h1>{{ msg }}</h1>
<firstcomponent></firstcomponent>
</div>
</template>
完成后的代码ru
<template>
<div id="app">
<img src="./assets/logo.png">
<h1>{{ msg }}</h1>
<firstcomponent></firstcomponent>
<secondcomponent></secondcomponent>
<ul>
<li><router-link to="/first">第一页</router-link></li>
<li><router-link to="/second">第二页</router-link></li>
</ul>
<router-view class="view"></router-view>
</div>
</template>
<script>
import firstcomponent from './component/firstcomponent.vue';
import secondcomponent from './component/secondcomponent.vue';
export default {
name: 'app',
data () {
return {
msg: 'Welcome to Your Vue.js App'
}
},
components: { firstcomponent,secondcomponent }
}
</script>
<style lang="scss">
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
h1, h2 {
font-weight: normal;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
</style>
5、使用路由搭建单页应用
cnpm install vue-router --save
在 webpack.config.js 加入别名,因为默认配置是运行时构建(构建方式有两种:独立构建和运行时构建,具体可以参考官方文档说明)
resolve: {
alias: {vue: 'vue/dist/vue.js'}
}
再按之前的方法写一个组件 secondcomponent.vue
然后修改 main.js,引入并注册 vue-router
import VueRouter from "vue-router";
Vue.use(VueRouter);并且配置路由规则和 app 启动配置项加上 router,修改后的 main.js 如下:
import Vue from 'vue'
import App from './App.vue'
import VueRouter from "vue-router";
import VueResource from 'vue-resource';
import secondcomponent from './component/secondcomponent.vue';
import Element from 'element-ui';
import 'element-ui/lib/theme-default/index.css';
Vue.use(Element);
//开启debug模式
Vue.config.debug = true;
Vue.use(VueRouter);
Vue.use(VueResource);
// 定义组件, 也可以像教程之前教的方法从别的文件引入
const First = { template: '<div><h2>我是第 1 个子页面</h2></div>' }
// 创建一个路由器实例
// 并且配置路由规则
const router = new VueRouter({
mode: 'history',
base: __dirname,
routes: [
{
path: '/first',
component: First
},
{
path: '/second',
component: secondcomponent
}
]
})
// 现在我们可以启动应用了!
// 路由器会创建一个 App 实例,并且挂载到选择符 #app 匹配的元素上。
const app = new Vue({
router: router,
render: h => h(App)
}).$mount('#app')
6、给页面加动态数据这时候的页面都是静态的(数据在写程序的时候已经固定了不能修改),而每个应用基本上都会请求外部数据以动态改变页面内容。对应有一个库叫 vue-resource 帮我们解决这个问题。
使用命令行安装
cnpm install vue-resource --save
在 main.js 引入并注册 vue-resource :
import VueResource from 'vue-resource'
Vue.use(VueResource);
我们在 secondcomponent.vue 上来动态加载数据
添加一个列表:
<ul>
<li v-for="article in articles">
{{article.title}}
</li>
</ul>
在 data 里面加入数组 articles 并赋值为[]
然后在 data 后面加入加入钩子函数 mounted (详细请参照官方文档关于 vue 生命周期的解析),data 和 mount 中间记得记得加逗号
mounted: function() {
this.$http.jsonp('https://api.douban.com/v2/movie/top250?count=10', {}, {
headers: {
},
emulateJSON: true
}).then(function(response) {
// 这里是处理正确的回调
this.articles = response.data.subjects
// this.articles = response.data["subjects"] 也可以
}, function(response) {
// 这里是处理错误的回调
console.log(response)
});
}
7、添加样式美化页面命令行安装 ElementU
cnpm install element-ui@next -S
然后在 main.js 引入并注册
import Element from 'element-ui'
import 'element-ui/lib/theme-default/index.css'
Vue.use(Element)
下面三个加载器必须安装
cnpm install style-loader --save-dev
cnpm install css-loader --save-dev
cnpm install file-loader --save-dev
在 webpack.config.js 中的 loaders 数组加入以下配置, 记得该加逗号的地方加逗号!
{
test: /\\.css$/,
loader: "style!css"
},
{
test: /\\.(eot|woff|woff2|ttf)([\\?]?.*)$/,
loader: "file"
}
修改完的 webpack.config.js 如下
var path = require('path')
var webpack = require('webpack')
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, './dist'),
publicPath: '/dist/',
filename: 'build.js'
},
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
loaders: {
// Since sass-loader (weirdly) has SCSS as its default parse mode, we map
// the "scss" and "sass" values for the lang attribute to the right configs here.
// other preprocessors should work out of the box, no loader config like this necessary.
'scss': 'vue-style-loader!css-loader!sass-loader',
'sass': 'vue-style-loader!css-loader!sass-loader?indentedSyntax'
}
// other vue-loader options go here
}
},
{
test: /\.js$/,
loader: 'babel-loader',
exclude: /node_modules/
},
{
test: /\.(png|jpg|gif|svg)$/,
loader: 'file-loader',
options: {
name: '[name].[ext]?[hash]'
}
},
{
test: /\.css$/,
loader: "style-loader!css-loader"
},
{
test: /\.(eot|woff|woff2|ttf)([\\?]?.*)$/,
loader: "file-loader"
}
]
},
resolve: {
alias: {
// 'vue$': 'vue/dist/vue.esm.js',
vue: 'vue/dist/vue.js'
}
},
devServer: {
historyApiFallback: true,
noInfo: true
},
performance: {
hints: false
},
devtool: '#eval-source-map'
}
if (process.env.NODE_ENV === 'production') {
module.exports.devtool = '#source-map'
// http://vue-loader.vuejs.org/en/workflow/production.html
module.exports.plugins = (module.exports.plugins || []).concat([
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"production"'
}
}),
new webpack.optimize.UglifyJsPlugin({
sourceMap: true,//不生成源码映射
compress: {
warnings: false
}
}),
new webpack.LoaderOptionsPlugin({
minimize: true
})
])
}
给豆瓣的电影列表套个衣服(样式) :
<el-card class="box-card">
<div slot="header" class="clearfix">
<h1 style="line-height: 36px; color: #20A0FF">豆瓣电影排行榜</h2>
</div>
<div v-for="article in articles" class="text item">
{{article.title}}
</div>
</el-card>
编译
npm run build