vue入门学习笔记

来源:互联网 发布:麻将斗牛作算法 编辑:程序博客网 时间:2024/05/01 00:46

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


                                             
0 0