前端菜鸟的Element-UI使用

559 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情

自己在后端学习过程中总要写点界面来美化一下自己想要的结果吧,奈何自己学的不够好,有时候要琢磨很久前端,所以特此写一点现成的,看看以后能不能直接用。这里的项目是我自己随便写的一个奶茶项目,没啥质量,数据也是随便写的。

悬浮框

直接上代码

<el-table
    ref="multipleTable"
    :data="administrators"
    v-loading="loading">
    <el-table-column label="编号" prop="id" width="120" align="center"></el-table-column>
    <el-table-column label="姓名" prop="name" width="120" align="center"></el-table-column>
    <el-table-column label="电话" prop="telephone" width="180" align="center"></el-table-column>
    <!--重要的是这里-->
    <el-table-column label="店铺编号" prop="storeId" width="120" align="center">
        <template slot-scope="scope">
            <el-popover
                placement="top-start"
                width="500"
                trigger="hover"
                :open-delay="400"
                @show="card(scope.row.storeId)">
                <show-store :store="store"></show-store>
                <el-tag slot="reference">{{ scope.row.storeId }}</el-tag>
            </el-popover>
        </template>
    </el-table-column>
    <el-table-column label="角色" prop="role.roleName" width="120" align="center"></el-table-column>
    <!--                <el-table-column label="店铺编号" prop="storeId" width="120" align="center"></el-table-column>-->
​
​
    <el-table-column fixed="right" label="操作" width="350" align="center">
        <template slot-scope="scope">
            <el-button @click="handleTel(scope.row)" type="primary" size="mini" plain round>修改电话号码
            </el-button>
            <el-button @click="handleRole(scope.row)" type="primary" size="mini" plain round>修改角色
            </el-button>
            <el-button @click="handleStore(scope.row)" type="primary" size="mini" plain round>委派店铺
            </el-button>
        </template>
    </el-table-column>
​
​
</el-table>

我这里想实现一个鼠标悬浮列表中的一项得到的效果,

image.png 对应的方框里面的内容就是

 <show-store :store="store"></show-store>

这个组件,:store传递数据,当悬浮上去就会触发@show="card(scope.row.storeId)">事件,对应的方法这样的

card(storeId) {
    this.$axios.get(`/admin/store/one/${storeId}`).then((resp) => {
        const _this = this
        if (resp.code == 200) {
            _this.$message({
                type: "success",
                message: resp.msg,
            });
            _this.store = resp.data
​
        } else {
            _this.$message({
                type: "error",
                message: resp.msg,
            });
        }
    })
},

那就再放一下悬浮的组件吧

<template>
    <el-descriptions title="店铺信息" :column="3" border>
        <el-descriptions-item label="店名" label-class-name="my-label" content-class-name="my-content">{{ store.name }}
        </el-descriptions-item>
        <el-descriptions-item label="电话号码">{{ store.phone }}</el-descriptions-item>
        <el-descriptions-item label="工作时间">{{ store.businessHours }}</el-descriptions-item>
        <el-descriptions-item label="坐标">{{ store.geohash }}</el-descriptions-item>
        <el-descriptions-item label="地址" :contentStyle="{'text-align': 'center'}">{{ store.address }}
        </el-descriptions-item>
        <el-descriptions-item label="是否停用">
            <el-tag size="small">{{ store.delete }}</el-tag>
        </el-descriptions-item>
    </el-descriptions>
</template>

对话框提交表单

先放结果图

image-20220816164223847

<el-dialog title="加料" :visible.sync="editVisible" width="30%">
  <el-form ref="feedForm" :model="feedForm" label-width="70px">
    <el-form-item label="名字">
      <el-input v-model="feedForm.name"></el-input>
    </el-form-item>
    <el-form-item label="价格">
      <el-input v-model="feedForm.price"></el-input>
    </el-form-item>
  </el-form>
  <span slot="footer" class="dialog-footer">
    <el-button @click="editVisible = false">取 消</el-button>
    <el-button type="primary" @click="saveEdit">确 定</el-button>
  </span>
</el-dialog>

editVisible是bool型的,用于是否弹出,按钮来操作对应的响应,这个没什么好说的。

为分类添加信息

多选框形式

image-20220816164444093

点击添加以后,显示的对话框里面对应多选了对应类型下的所有数据

<el-dialog title="添加" :visible.sync="editVisible" width="30%">
    <span>为 {{ curName }} 添加奶茶</span>
    <el-table
        ref="curSelect"
        :data="teamilks"
        tooltip-effect="dark"
        v-loading="selectLoading"
        style="width: 100%"
        @selection-change="handleSelectionChange">
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="name" label="奶茶名" width="120">
            <template slot-scope="scope">{{ scope.row.name }}</template>
        </el-table-column>
        <el-table-column prop="price" label="价格" show-overflow-tooltip>
            <template slot-scope="scope">{{ scope.row.price }}</template>
        </el-table-column>
    </el-table>
    <span slot="footer" class="dialog-footer">
        <el-button @click="editVisible=false">取 消</el-button>
        <el-button type="primary" @click="saveEdit">确 定</el-button>
    </span>
</el-dialog>

这里需要说明一些细节内容,其中:

  • :data是表单要绑定的数据,在这里就是teamilks,是我们要进行多选进分类的基础数据,或者说是我们请求到的所有数据。
  • ref是我们多选中的数据的位置,这个里面的数据不在data里面,而是在$refs上,但是刚开始的时候上面是空的,而在这个表格被创建以后,this的对象就指到了上面了,因为如果不把editVisible为true,那么永远拿不到toggleRowSelection这个函数(因为我们跟ref绑定了,所以这个没有在data中出现的对象也有属性,是element-ui帮我们做的)

这里有一个我们修改分类时候的按钮上的方法:

getCateTeamilk(index, row) {
    const _this = this;
    // 显示对话框
    _this.editVisible = true;
​
    _this.selectLoading = true
    _this.curName = row.name;
    // 这里注意一下,是刚开始的时候我们没有 curSelect 的,但是在点击过一次之后就有这个对象了,需要清除所有选中
    if (_this.$refs.curSelect != null)
        _this.$refs.curSelect.clearSelection();
    // 请求该分类下的所有数据(在这里就是奶茶编号)
    _this.$axios.get("/admin/category/get/" + row.id).then(
        (resp) => {
            if (resp.code == 200) {
                // 这里的 toAdd 就是我们原本分类下的所有数据的 id,也就是个数组
                _this.toAdd = resp.data;
                for (let i = 0; i < _this.toAdd.teamilkIds.length; i++) {
                    for (let j = 0; j < _this.teamilks.length; j++) {
                        if (_this.toAdd.teamilkIds[i] == _this.teamilks[j].id) {
                                _this.$refs.curSelect.toggleRowSelection(_this.teamilks[j]);
                            break;
                        }
                    }
                }
            } else {
                _this.$message({type: "error", message: resp.msg});
            }
            _this.selectLoading = false
        }
    );
},

上面一些注释说明了情况,我在这里讲解一下两个for循环,teamilks是所有数据(里面是详细信息,而不是id数组),toAdd就是我们原本分类下的所有数据的 id,我们的操作就是选出在toAdd的id下的奶茶信息加入到_this.$refs.curSelect.toggleRowSelection(如果我们后端得到的就是分类下的信息对象数组,而不是id数组,那就不用这部操作了,因为我们这里被选中的是表格的一行,所以一行就是一个对象,所以curSelect是对象数组)

然后我们里面还有一个多选的handleSelectionChange函数

handleSelectionChange(val) {
    this.teamilkItems = val;
},

下拉框格式

image-20220816174744831

这里示例是一个表单的一个属性,所以是el-form-item,懂的话其实不用看就可以了

<el-form-item label="奶茶温度">
    <el-select v-model="teamilk.temperatures" multiple placeholder="+New Temperature"
               size="mini">
        <el-option v-for="item in allTemperatures" :key="item.id"
                   :label="item.name"
                   :value="item.id"></el-option>
    </el-select>
</el-form-item>

el-select就是下拉框进行选择,el-option就是被选中的√,这个el-option组件 | Element

说明:

  • multiple表示多选,没什么好说的
  • v-model就是我们选中√的数据信息
  • el-option中的v-for就是所有数据,:label就是我们展示的选项的标签(数据名字),若不设置则默认与 :value 相同,一般我们不默认。
  • :key就是v-for里面的唯一表示
  • :valueel-option定义的,意思是选项的值,一般和key相同即可,因为这个value对应的我们设置的id和el-selectv-model里面的数组相互对应也就是说value的值和v-model要是一个东西

首页数据统计表显示

\