Vue+ElementUI前端实现分页和模糊查询

博客介绍了Vue项目部分代码,包括变量定义,如tableData用于表格展示数据,tempDate保存后台请求数据;还讲解了computed和watch方法,watch可关联视图数据与函数,数据变化时执行关联函数;介绍了向后台请求数据的方法及表格绑定经过计算分页后的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.变量的定义:

  tableData:该变量用来向表格中展示数据。

  tempDate:该变量用来保存在后台请求过来的所有数据,便于模糊查询时进行匹配。

  data() {
    return {
      tableData: [],
      tempDate: [],
      currentPage: 1, // 当前页码
      pageSize: 5, // 每页显示的行数
      totals: 0,
      name: "",
      movie: {
        id: "",
        name: "",
        director: "",
        screenwriter: "",
        performer: "",
        form: "",
        country: "",
        language: "",
        releaseDate: "",
        filmlength: "",
        info: "",
        type: "",
        logo: "",
        video: "",
      },
      select: "",
    };

 2.computed和watch方法

  watch本身很容易理解, watch负责将视图中的数据与某个函数关联起来。当Vue视图中的数据变化时, 关联的函数会被执行。

  watch可以监听data里面值的变化。当input输入框中的值发生变化的时候,与其关联的函数便会执行。

<el-input v-model="select" placeholder="请输入筛选关键词" />
computed: {
    // 计算当前表格中的数据,用于分页。
    data() {
      //slice方法通过索引位置获取并返回一个新的子数组。
      //用法:arrayObj.slice(start,end),其中,arrayObj 为原数组,
      //start设定新数组的起始位置,end设定新数组的结束位置。
      return this.tableData.slice(
        (this.currentPage - 1) * this.pageSize,
        this.currentPage * this.pageSize
      );
    },
  },
  watch: {
    select: function () {
      // 如果输入框的值为空的话,便会执行
      if (this.select === "") {
        this.tableData = this.tempData; // tempData中存储的是后台请求来的所有信息
      } else {
        // 如果不为空的话
        this.tableData = [];
        for (let item of this.tempData) { // 对tempData中的所有信息进行遍历
          if (
            item.name.includes(this.select) ||
            item.author.includes(this.select)
          ) {
            // 如果tempData中的某一条目中的某个属性包含输入框中的内容时,
            // 就将这个条目放入tableData中,因为tableData中保存的是用来向表格中展示的数据
            this.tableData.push(item);
          }
        }
      }
    },
  },  

3.向后台请求数据的方法,写在methods里面

queryAllMovies() {
    this.tempData = [];
    this.tableData = [];
    this.$http.post("***/****(自己的后台接口)", {}).then((resp) => {
      this.tableData = resp.data;
      this.tempData = resp.data;
    });
  },

4.表格table

  该表格绑定的是data,该绑定的数据为computed中的data,是经过计算分页之后的数据。

<el-table :stripe="true" border :data="data" style="width: 100%;height:550px">
    <el-table-column type="selection" width="50" />
    <el-table-column type="index" :index="calcIdx" width="80" />
    <el-table-column prop="name" label="电影名" width="180" />
    <el-table-column prop="name" label="图片" width="65">
        <template slot-scope="scope">
            <img :src="scope.row.logo" style="height:60px;">
        </template>
    </el-table-column>
    <el-table-column prop="director" label="导演" width="180" />
    <el-table-column prop="screenwriter" label="编剧" width="180" />
    <el-table-column prop="performer" label="主演" width="240" />
    <el-table-column prop="form" label="类型" width="100" />
    <el-table-column prop="country" label="制片国家/地区" width="180" />
    <el-table-column prop="language" label="语言" width="180" />
    <el-table-column prop="releaseDate" label="上映日期" width="180" />
    <el-table-column prop="filmlength" label="片长" width="140" />
    <el-table-column prop="score" label="评分" width="120" />
    <el-table-column prop="type" label="影视种类" width="120">
    </el-table-column>
    <el-table-column label="内容简介" width="120">
        <template slot-scope="scope">
            <el-button type="text" @click="openContentInfo(scope.row.info)">查看详情</el-button>
        </template>
    </el-table-column>
    <el-table-column fixed="right" label="操作" width="160">
        <template slot-scope="scope">
            <el-button type="text" @click="Update(scope.row)">修改</el-button>
            <el-button type="text" style="margin-left: 30px" @click="DeleteYes(scope.row.id)">删除</el-button>
        </template>
    </el-table-column>
</el-table>
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage"
    :page-sizes="[5, 10, 15, 20]" :page-size="pageSize" layout="total,  prev, pager, next, jumper"
    :total="tableData.length">
</el-pagination>

注:展示的为项目的部分代码。

最后实现的效果展示:

1cfed8017829445e8a61397cf5ad3de6.gif

 

 

 

 

以下是一个简单的实现代码,仅供参考: 后端代码: 1. 创建新闻表 在MySQL中创建名为news的表: ```sql CREATE TABLE `news` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `author` varchar(255) NOT NULL, `content` text NOT NULL, `release_date` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 2. DAO层接口 定义NewsDao.java接口: ```java public interface NewsDao { List<News> findAll(); List<News> findByAuthor(String author); } ``` 3. 新闻实体类 定义News.java实体类: ```java public class News { private Long id; private String title; private String author; private String content; private Date releaseDate; // 省略gettersetter方法 } ``` 4. Controller层接口 定义NewsController.java接口: ```java @RestController @RequestMapping("/api/news") public class NewsController { @Autowired private NewsDao newsDao; @GetMapping("/list") public List<News> list() { return newsDao.findAll(); } @GetMapping("/search") public List<News> search(@RequestParam String author) { return newsDao.findByAuthor(author); } } ``` 5. 分页功能实现 可以使用Mybatis分页插件PageHelper实现分页功能。在pom.xml文件中引入PageHelper依赖: ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> ``` 在NewsDao.java接口中添加分页查询方法: ```java public interface NewsDao { List<News> findAll(); List<News> findByAuthor(String author); List<News> findAllByPage(int pageNum, int pageSize); } ``` 在NewsController.java接口中实现分页查询: ```java @GetMapping("/list") public PageInfo<News> list(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "10") int pageSize) { PageHelper.startPage(pageNum, pageSize); List<News> newsList = newsDao.findAll(); return new PageInfo<>(newsList); } ``` 前端代码: 1. 列表展示 使用ElementUITable组件展示新闻列表: ```html <el-table :data="newsList" style="width: 100%" stripe> <el-table-column prop="title" label="标题"></el-table-column> <el-table-column prop="author" label="作者"></el-table-column> <el-table-column prop="content" label="内容"></el-table-column> <el-table-column prop="releaseDate" label="发布日期"></el-table-column> </el-table> ``` 2. 分页功能实现 使用ElementUI的Pagination组件实现分页功能: ```html <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage" :page-sizes="[10, 20, 50, 100]" :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"> </el-pagination> ``` 在Vue组件中实现相关方法: ```javascript export default { data() { return { newsList: [], currentPage: 1, pageSize: 10, total: 0 } }, methods: { handleSizeChange(val) { this.pageSize = val this.fetchData() }, handleCurrentChange(val) { this.currentPage = val this.fetchData() }, fetchData() { axios.get('/api/news/list', { params: { pageNum: this.currentPage, pageSize: this.pageSize } }).then(res => { this.newsList = res.data.list this.total = res.data.total }) } } } ``` 3. 按照新闻作者模糊查询新闻 使用ElementUI的Input组件实现输入框,结合Button组件实现查询功能: ```html <el-input placeholder="请输入作者" v-model="searchAuthor" style="width: 200px"></el-input> <el-button type="primary" @click="handleSearch">搜索</el-button> ``` 在Vue组件中实现相关方法: ```javascript export default { data() { return { searchAuthor: '' } }, methods: { handleSearch() { axios.get('/api/news/search', { params: { author: this.searchAuthor } }).then(res => { this.newsList = res.data }) } } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值