[vue]基于vue-cli、elementUI的Vue超简单入门小例子

基于vue-cli、elementUI的Vue超简单入门小例子

  • 这个例子还是比较简单的,独立完成后,能大概知道vue是干嘛的,可以写个todoList的小例子。
  • 开始写例子之前,先对环境的部署做点简单的介绍,其实和Vue官方的差不多。
  1. #如若没有安装过vue-cli,先全局安装一下vue-cli
  2. $ cnpm i -g vue-cli
  3. #到自己喜欢的目录下创建一个基于 webpack 模板的新项目
  4. $ vue init webpack my-project
  5. #
  6. #
  7. #之后会有如下询问
  8. ? Project name (my-project) #回车
  9. ? Project description  #回车,也可以写点项目描述
  10. ? Author #回车,或者输入作者
  11. ? Vue build standalone #回车
  12. ? Install vue-router? (Y/n) #这里是官方推荐的路由,果断yes
  13. ? Use ESLint to lint your code? #No
  14. ? Set up unit tests #No
  15. ? Setup e2e tests with Nightwatch? #No
  16. ? Should we run `npm install` for you after the project has been created? (recommended)
  17. > Yes, use NPM #可以按上下方向键选择,这里我选第一个NPM,按回车确认
  18.   Yes, use Yarn
  19.   No, I will handle that myself
  20. #等待完成

复制代码

完成后可能会有警告,没事,不是ERR就好

  1. $ cd my-project #进入刚新建的文件夹
  2. $ cnpm install  #这里用的是淘宝的NPM镜像,不懂可以自行搜索cnpm
  3. $ npm run dev
  4. ###I  Your application is running here: http://localhost:8080

复制代码

**确保端口没被占用,打开localhost:8080 see see **


[td]

名称 说明
build 项目构建的一些代码
config 开发环境的配置
node_modules 一些依赖包
src 源码,我们就在这个文件夹内写代码
static 静态文件
.babelrc ES6编译的一些配置
.editorconfig 代码风格配置文件
.gitignore git上传时忽略的一些文件,比如node_modules这个文
.postcssrc.js 听说是转换CSS样式的
index.html 入口页面
package-lock.json 听说是更详细的package.json
package.json 项目信息,项目名称,开发的依赖的记录等,一个JSON文件

现在打开src\componnets\HelloWorld.vue 把大部分代码删除,剩余如下:

  1. <template>
  2.     <h1>{{ msg }}</h1>
  3. </template>
  4. <script>
  5. export default { //ES6语法,用于输出到外部,这样就可以在其他文件内用import输入
  6.   name: ‘HelloWorld’,
  7.   data () {    //由于是组件,data必须是个函数,这是ES6写法,data后面加括号相当于data: function () {}
  8.     return {   //记得return不然接收不到数据
  9.       msg: ‘Welcome’ //上面的 msg 就是这里输出的
  10.     }
  11.   }
  12. }
  13. </script>
  14. <style>
  15. h1 {
  16.   font-weight: normal;
  17. }
  18. a {
  19.   color: #42b983;
  20. }
  21. </style>

复制代码

到这里用了点ES6语法,如果对export和import不了解的,建议看看相关的介绍,暂时不想看也可以照着敲代码。不过建议还是看看,只需10分钟了解下export和import就好—— 阮一峰ECMAScript 6 入门

[color=rgba(0, 0, 0, 0.75)]可以看到,之前打开的页面变了样:

####现在我们来安装一下element-ui(关于element-ui详细情况请自行搜索)

可以按照官方方法使用npm i element-ui -S命令进行安装
也可以在package.json中添加,后通过cnpm install进行安装

这里我们选择2,打开package.json,找到devDependencies并在最后加上”element-ui”: “^2.2.1”

  1. “devDependencies”: {
  2. “element-ui”: “^2.2.1”

复制代码

打开命令行停止服务,再通过cnpm install进行安装,安装完成后npm run dev启动
打开main.js在里面添加三行内容

  1. import ElementUI from ‘element-ui’ //新添加
  2. import ‘element-ui/lib/theme-chalk/index.css’ //新添加,避免后期打包样式不同,要放在import App from ‘./App’;之前
  3. import Vue from ‘vue’
  4. import App from ‘./App’
  5. import router from ‘./router’
  6. Vue.use(ElementUI)   //新添加
  7. Vue.config.productionTip = false
  8. /* eslint-disable no-new */
  9. new Vue({
  10.   el: ‘#app’,
  11.   router,
  12.   components: { App },
  13.   template: ‘<App/>’
  14. })

复制代码

添加了这三行,我们就可以使用element-ui了
接下来在components文件夹内新建一个NewContact.vue 文件,添加如下代码

  1. <template>
  2.   <el-row>
  3.     <el-button type=”success”>1</el-button>
  4.   </el-row>
  5. </template>
  6. <script>
  7. </script>
  8. <style>
  9. </style>

复制代码

打开之前的HelloWorld.vue对内容进行修改(router是官方路由插件,router-link to是router的语法):

  1. <template>
  2. <!– 这里router-link to=”newcontact”会把路由导航到http://localhost:8080/#/newcontact   –>
  3.     <router-link to=”newcontact”><h1>{{ msg }}</h1></router-link>
  4. </template>

复制代码

打开router/index.js,添加新路由(router是官方路由插件,深入学习请查看文档

  1. import Vue from ‘vue’
  2. import Router from ‘vue-router’
  3. import HelloWorld from ‘@/components/HelloWorld’
  4. import NewContact from ‘@/components/NewContact’//新添加,之后在下方的component: NewContact才会生效
  5. Vue.use(Router)
  6. export default new Router({
  7.   routes: [
  8.     {
  9.       path: ‘/’,
  10.       name: ‘HelloWorld’,
  11.       component: HelloWorld
  12.     },
  13.     {
  14.       path: ‘/newcontact’,//和router-link to相呼应,导航到/newcontact
  15.       name: ‘NewContact’,
  16.       component: NewContact
  17.     }
  18.   ]
  19. })

复制代码

保存后打开页面可以看到如下:

之前的welcome变成了可点击的链接,点击后跳转看到如下页面

至此,已经我们已经把该引入的依赖,和路由的简单配置,简单组件的使用给完成了
接下来我们把精力都放到NewContact.vue这个组件,后面的代码几乎都在这个组件


打开NewContact.vue键入如下代码:

  1. <template>
  2.   <el-row>
  3.     姓名:{{info.name}}
  4.     <el-input v-model=”info.name” placeholder=”请输入姓名”></el-input>
  5.     年龄:{{info.age}}
  6.     <el-input v-model=”info.age” placeholder=”请输入年龄”></el-input>
  7.     性别:{{info.sex}}
  8.     <el-select v-model=”info.sex” placeholder=”请选择”>
  9.       <el-option v-for=”item in options” :key=”item” :value=”item”></el-option><!– 这里的key官方推荐在v-for时使用,不然会警告,但不影响使用 –>
  10.     </el-select>
  11.   </el-row>
  12. </template>
  13. <script>
  14. export default {
  15.   name: “NewContact”,
  16.   data(){
  17.     return {
  18.       info: {
  19.         name: ”,
  20.         age: null,
  21.         sex: ”
  22.       },
  23.       options: [
  24.         ‘女’,’男’,’保密’
  25.       ]
  26.     }
  27.   }
  28. }
  29. </script>
  30. <style>
  31. </style>

复制代码

<el-input v-model=”info.name”></el-input>
el-input是element-ui的组件,以el-开头的是element-ui的组件
v-model这里的v-model是Vue的指令,官方说法是——在表单控件或者组件上创建双向绑定。
=”info.name”就是v-model绑定的数据,在data中return的内容里看到info.name对应的是”;info.age对应的是null

  1. return {
  2.       info: {
  3.         name: ”,
  4.         age: null,
  5.         sex: ”
  6.       }

复制代码

当我们打开http://localhost:8080/#/newcontact

在输入框输入内容时可见,姓名:{{info.name}}双花括号里的内容也跟着改变,这就是双向绑定

 

 

<el-option v-for=”item in options” :key=”item” :value=”item”>
v-for=”item in options”就是循环options这个数组的内容

  1. options: [
  2.         ‘女’,’男’,’保密’
  3.       ]

复制代码

如果在里面添加内容,那么下拉菜单的内容会一起变化,一 一对应
:value=”item”会把你选的(‘女’,‘男’,‘保密’)传给<el-select v-model=”info.sex”>
v-model=”info.sex”会传给data中的info.sex

  1. return {
  2.       info: {
  3.         name: ”,
  4.         age: null,
  5.         sex: ”
  6.       }

复制代码

接下来在加入新代码,NewContact.vue目前的代码如下:

  1. …..
  2.     </el-select>
  3.     <el-button @click=”create”>创建</el-button>
  4.     <template>
  5.       <el-table :data=”tabledata” align=”left”>
  6.         <el-table-column prop=”name” label=”姓名”></el-table-column>
  7.         <el-table-column prop=”age” label=”年龄”></el-table-column>
  8.         <el-table-column prop=”sex” label=”性别”></el-table-column>
  9.         <el-table-column label=”操作”>
  10.           <template slot-scope=”a”>
  11.             <el-button size=”mini” type=”danger” @click=”del(a.$index)”>删除</el-button>
  12.           </template>
  13.         </el-table-column>
  14.       </el-table>
  15.     </template>
  16.   </el-row>
  17. </template>
  18. <script>
  19. export default {
  20.   name: “NewContact”,
  21.   data(){
  22.     return {
  23.       info: {
  24.         name: ”,
  25.         age: null,
  26.         sex: ”
  27.       },
  28.       options: [
  29.         ‘女’,’男’,’保密’
  30.       ],
  31.       tabledata:[
  32.         {name: ‘Leo’, age: 12, sex: ‘man’},
  33.         {name: ‘Lei’, age: 22, sex: ‘women’},
  34.         {name: ‘Lii’, age: 65, sex: ‘men’}
  35.       ]
  36.     }
  37.   }
  38. }
  39. </script>
  40. <style>
  41. </style>

复制代码

<el-button @click=”create” type=”success”>创建</el-button>
这里就是创建了一个按钮,@是v-on的缩写,点击后会出发create这个函数

<el-table :data=”tabledata”>
就是表格要绑定的数据

<el-table-column prop=”name”>
在表格绑定数据情况下prop用于数据传递,tabeldata里的name

<template slot-scope=”a”>
是Vue2.5.0后替代之前scope的作用域插槽,”a”是随便的名字,就用用来后去table的状态,可以获取的row, column, $index和store,这里我们只需要获取index就行了,相关具体内容点这里


@click=”del(a.$index)
@是v-on的缩写,表示点击后调用del函数,a.$index表示slot-scope获取到的index值

  1. tabledata:[//这里的内容是方便我们看到table的变化,可见页面上的table有了如下的内容
  2.         {name: ‘Leo’, age: 12, sex: ‘man’},
  3.         {name: ‘Lei’, age: 22, sex: ‘women’},
  4.         {name: ‘Lii’, age: 65, sex: ‘men’}
  5.       ]

复制代码

打开页面可以看到

 

我们点击创建和删除按钮并没有反应,所以我们要添加methods,在它内部添加两个方法,一个是创建,一个是删除

  1. data(){
  2. },
  3.   methods: {//添加在data(){…},的后面
  4.     create(){
  5.       this.tabledata.push(this.info)//给tabledata添加一个对象(之前我们创建的info)
  6.       this.info =  {name: ”, age: null, sex: ”}//点击创建后,让option还原,而不是停留在所选的项
  7.     },
  8.     del(index){
  9.       this.tabledata.splice(index,1)//删除点击的对象,index是lot-scope=”a” a.$index传过来的
  10.     }
  11.   }

复制代码


到这里已经完成了添加和删除,为了在我们刷新页面后,数据依然保存着,我们可以用localStorage本地存储数据
关于localStorage可以点击这里了解

接下来我们在src内新建一个store文件夹,和App.vue、components同一个层级,在里面新建一个store.js,内容如下

  1. const STORAGE_KEY = ‘tabale-vuejs’//名字随便起
  2. export default {//向往输出,以便组件接收
  3.         fetch() {//我们定义的获取数据的方法
  4.                 return JSON.parse(window.localStorage.getItem(STORAGE_KEY)
  5.                  || ‘[]’)
  6.         },
  7.         save(items) {//我们定义的保存数据的方法
  8.                 window.localStorage.setItem(STORAGE_KEY, JSON.stringify(items))
  9.         }
  10. }

复制代码

getItem和setItem是window.localStorage的获取和保存数据的方法
我们用JSON.stringify和JSON.parse把数据转成字符串和解析,这样就方便我们写入tabledata
接下来我们添加新代码

  1. <script>
  2. import Storage from ‘../store/store’//新添加,把刚写的localStorage导入
  3. export default {
  4. name: “NewContact”,
  5.   data(){
  6.     return {
  7.       info: {
  8.         name: ”,
  9.         age: null,
  10.         sex: ”
  11.       },
  12.       options: [
  13.         ‘女’,’男’,’保密’
  14.       ],
  15.       tabledata: Storage.fetch()//把之前的删除,写入这个获取数据的方法
  16.     }
  17.   },
  18.   methods: {
  19.     create(){
  20.       this.tabledata.push(this.info)
  21.       this.info =  {name: ”, age: null, sex: ”}
  22.     },
  23.     del(index){
  24.       this.tabledata.splice(index,1)
  25.     }
  26.   },
  27.   watch:{//新添加,watch是vue的监听,一旦监听对象有变化就会执行相应操作
  28.     tabledata{//新添加,被监听的对象
  29.       handler(items){Storage.save(items)},//新添加,监听对象变化后所做的操作,一个函数,保存数据
  30.       deep: true//深度监听,避免数据的嵌套层数太多,要使用深度监听,防止数据层级过多监听不到
  31.   }

复制代码

tabledata:由于fetch()得到的是数组,所以直接tabledata: 后写入就行类似于

  1. tabledata:[{…},{…}]

复制代码

当我们添加删除数据时,可以打开chrmoe浏览器的F12>Application>Local Storage进行查看

 

总的来说就是我们点击页面上的创建按钮,watch监听到tabledata有变化,就执行savedata(items){Storage.save(items)}进行数据保存,点击删除时,tabledata也有变化,同样会执行保存
可能之前写的内容会有不小心写错字母的情况,最后把NewContact.vue稍稍修改样式后,把完整的内容拷贝到下方:
NewContact.vue

  1. <template>
  2.   <el-row>
  3.     <el-col :xs=”24″ :sm=”18″ :md=”14″ :lg=”10″ id=”main”>
  4.     <label>姓名:</label>
  5.     <el-input v-model=”info.name” placeholder=”请输入姓名”></el-input>
  6.     <label>年龄:</label>
  7.     <el-input v-model=”info.age” placeholder=”请输入年龄”></el-input>
  8.     <label>性别:</label>
  9.     <el-select v-model=”info.sex” placeholder=”请选择”>
  10.       <el-option v-for=”item in options” :key=”item” :value=”item”></el-option><!– 这里的key官方推荐在v-for时使用,不然会警告,但不影响使用 –>
  11.     </el-select>
  12.     <el-button  class=”btn-auto” @click=”create” type=”success”>创建</el-button>
  13.     <template>
  14.       <el-table :data=”tabledata” align=”left”>
  15.         <el-table-column prop=”name” label=”姓名”></el-table-column>
  16.         <el-table-column prop=”age” label=”年龄”></el-table-column>
  17.         <el-table-column prop=”sex” label=”性别”></el-table-column>
  18.         <el-table-column label=”操作”>
  19.           <template slot-scope=”a”>
  20.             <el-button size=”mini” type=”danger” @click=”del(a.$index)”>删除</el-button>
  21.           </template>
  22.         </el-table-column>
  23.       </el-table>
  24.     </template>
  25.     </el-col>
  26.   </el-row>
  27. </template>
  28. <script>
  29. import Storage from ‘../store/store’
  30. export default {
  31.   name: “NewContact”,
  32.   data(){
  33.     return {
  34.       info: {
  35.         name: ”,
  36.         age: null,
  37.         sex: ”
  38.       },
  39.       options: [
  40.         ‘女’,’男’,’保密’
  41.       ],
  42.       tabledata: Storage.fetch()
  43.     }
  44.   },
  45.   methods: {
  46.     create(){
  47.       this.tabledata.push(this.info)
  48.       this.info =  {name: ”, age: null, sex: ”}
  49.     },
  50.     del(index){
  51.       this.tabledata.splice(index,1)
  52.     }
  53.   },
  54.   watch:{
  55.     tabledata:{
  56.       handler(items){Storage.save(items)},
  57.       deep: true
  58.     }
  59.   }
  60. }
  61. </script>
  62. <style>
  63.     #main{
  64.       float: none;
  65.       margin: 0 auto;
  66.   }
  67.   .el-input{
  68.     padding-bottom: 5px;
  69.   }
  70.   .el-select {
  71.       display: block;
  72.   }
  73.   .btn-auto{
  74.       width: 100%;
  75.       margin-top: 12px;
  76.   }
  77. </style>

复制代码

这里是localStorage:

  1. const STORAGE_KEY = ‘tabale-vuejs’
  2. export default {
  3.         fetch() {
  4.                 return JSON.parse(window.localStorage.getItem(STORAGE_KEY)
  5.                  || ‘[]’)
  6.         },
  7.         save(items) {
  8.                 window.localStorage.setItem(STORAGE_KEY, JSON.stringify(items))
  9.         }
  10. }

复制代码

完成后我们要进行打包,方便直接在浏览器中运行
打开/config/index.js

  1.   build: {
  2.     // Template for index.html
  3.     index: path.resolve(__dirname, ‘../dist/index.html’),
  4.     // Paths
  5.     assetsRoot: path.resolve(__dirname, ‘../dist’),
  6.     assetsSubDirectory: ‘static’,
  7.     assetsPublicPath: ‘./’,//加了个. 避免生产路径的错误
  8.     /**
  9.      * Source Maps
  10.      */
  11.     productionSourceMap: false, //改为false

复制代码

然后运行$ npm run build
等待完成,会生成dist文件夹,直接打开里面的index.html就可以在浏览器运行了



[color=rgba(0, 0, 0, 0.75)]

下载说明:
1.本站资源都是白菜价出售,同样的东西,我们不卖几百,也不卖几十,甚至才卖几块钱,一个永久会员能下载全站100%源码了,所以单独购买也好,会员也好均不提供相关技术服务。
2.如果源码下载地址失效请联系站长QQ进行补发。
3.本站所有资源仅用于学习及研究使用,请必须在24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担。资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您权益请联系本站删除!
4.本站站内提供的所有可下载资源(软件等等)本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发);但本网站不能保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug;同时本站用户必须明白,【安安资源网】对提供下载的软件等不拥有任何权利(本站原创和特约原创作者除外),其版权归该资源的合法拥有者所有。
5.请您认真阅读上述内容,购买即以为着您同意上述内容。
安安资源网 » [vue]基于vue-cli、elementUI的Vue超简单入门小例子