由于目前vue的使用率挺高的,所以就基于前后端分离的思想搭建一个vue脚手架项目,并实现一个简单的表格功能。其中包含的技术点有vue脚手架的搭建、父子组件引用、父子组件之间的传参以及整合Element UI 组件库等。
npm install -g @vue-cli
# 或者用以下命令,但需要安装 cnpm
cnpm install -g @vue-cli
# 注意是 大写的 V
vue -V
# test-vue 是我的项目名
vue create test-vue
我们通过上下键选择最后,自定义配置
按上下键切换选项,按空格键 选择或取消,根据自己的要求选择,完成之后回车
module.exports = {
/** 区分打包环境与开发环境
* process.env.NODE_ENV==='production' (打包环境)
* process.env.NODE_ENV==='development' (开发环境)
* baseUrl: process.env.NODE_ENV==='production'?"https://cdn.didabisai.com/front/":'front/',
*/
// 基本路径
baseUrl: '/',
// 输出文件目录
outputDir: 'dist',
// eslint-loader 是否在保存的时候检查
// lintOnSave: true,
// use the full build with in-browser compiler?
// https://vuejs.org/v2/guide/installation.html#Runtime-Compiler-vs-Runtime-only
//compiler: false,
// webpack配置
// see https://github.com/vuejs/vue-cli/blob/dev/docs/webpack.md
chainWebpack: () => {},
configureWebpack: () => {},
//如果想要引入babel-polyfill可以这样写
// configureWebpack: (config) => {
// config.entry = ["babel-polyfill", "./src/main.js"]
// },
// vue-loader 配置项
// https://vue-loader.vuejs.org/en/options.html
//vueLoader: {},
// 生产环境是否生成 sourceMap 文件
// productionSourceMap: true,
// css相关配置
//css: {
// 是否使用css分离插件 ExtractTextPlugin
// extract: true,
// 开启 CSS source maps?
// sourceMap: false,
// css预设器配置项
// loaderOptions: {},
// 启用 CSS modules for all css / pre-processor files.
// modules: false
// },
// use thread-loader for babel & TS in production build
// enabled by default if the machine has more than 1 cores
//parallel: require('os').cpus().length > 1,
// 是否启用dll
// See https://github.com/vuejs/vue-cli/blob/dev/docs/cli-service.md#dll-mode
// dll: false,
// PWA 插件相关配置
// see https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-pwa
// pwa: {},
// webpack-dev-server 相关配置
devServer: {
open: process.platform === 'darwin',
port: 9099,
https: false,
hotOnly: false,
proxy: null, // 设置代理
before: app => {}
},
// 第三方插件配置
pluginOptions: {
// ...
}
}
import Vue from 'vue'
import Router from 'vue-router'
import Home from './views/Home.vue'
Vue.use(Router)
export default new Router({
mode: 'history',
base: process.env.BASE_URL,
routes: [
{
path: '/',
name: 'home',
component: Home
},
{
path: '/about',
name: 'about',
component: () => import('./views/About.vue')
},
{
path: '/userList',
name: 'userList',
component: () => import('./views/UserList.vue')
}
]
})
# 在项目根目录下,运行以下命令,即可添加 Element-UI依赖
npm i element-ui -S
# 添加 axios 用于向后台发送请求,不可缺少
npm i -save axios
搜索
查看
编辑
删除
export default {
data() {
return {
isUpdate: false,//默认弹框隐藏
list:[],// 初始化总数据【刷新重置】
resList:[],// 搜索结果数据[临时数据]
dataList:[],// 列表展示数据
total:0,
// 以下为搜索字段
sname:'',
snickname:'',
saddr:'',
sage:'',
}
},
methods:{
getList(){
var obj= null;
for (var i = 0; i<100;i++) {
obj = new Object();
obj.id = (i+1);
obj.name = 'tom'+(i+1);
obj.nickname = '昵称'+(i+1);
obj.sex = '性别'+(i+1);
obj.age = (i+1);
obj.birth = '2019-'+(i+1);
obj.addr = '地址'+(i+1);
// 由于没有真实数据,需要通过标识进行伪删除,如果通过下标删除 会打乱数组结构,从而删除会出现问题。(有接口的情况下不会出现问题)。
obj.isDel = 0;
this.list.push(obj);
this.resList.push(obj);
}
// 初始化 展示前十条信息
for(var i=0;i<10;i++){
this.dataList[i] = this.resList[i];
}
this.total = Math.ceil(this.resList.length/10);
}
},
mounted:function(){
this.getList();
}
}
接下来我们来实现父组件 UserList.vue 中引用子组件 UserEdit.vue。
import UserEdit from './UserEdit.vue';
// 并在 export default 下添加 该组件
components: {
UserEdit
},
handleUpdate(index,row){
// 此属性用于控制 dialog 弹框的显示与隐藏,为true则显示,在 dialog 标签中设置
this.isUpdate=true;
}
父子组件的传值是比较重要的因为在我们平时是使用非常频繁的。
1、父组件向子组件传值
data() {
return {
isUpdate: false,
isShow:false,
list:[],// 初始化总数据【刷新重置】
resList:[],// 搜索结果数据[临时数据]
dataList:[],// 列表展示数据
total:0,
sname:'',
snickname:'',
saddr:'',
sage:'',
user:null
}
},
handleUpdate(index,row){
// 调用时,显示弹框组件
this.isUpdate=true;
// 进行对象深拷贝,防止在子组件修改数据时父组件的数据也跟着修改
var obj = this.dCopy(row);
// 把 深拷贝返回的对象赋给 刚才定义的全局变量 user 用于传递给子组件
this.user = obj;
}
export default{
// 用于接收父组件传过来的值【可为 字符串、对象、数组等】
// 此 user 对应 标签中 v-model中的user
props:["user"],
data(){
return{}
}
}
2、子组件向父组件传值
当我们修改用户信息之后会提交信息到后台,此时就会用到子向父传值
getChild(cuser){
this.user = cuser;
for(var i=0;i
本示例就讲到这里,其他 关于 搜索、分页、查看、删除等功能相对比较简单,此项目就不做详述!!!