当前位置: 首页 > news >正文

实现搜索功能:第一部分

实现搜索功能:第一部分

从本节开始,我们将实现我们的食谱小应用的搜索功能!

  • 首先我们先看一下API文章,用什么样的方法来获取全部的食谱的

在这里插入图片描述

  • 所以我们按照这个文章先写一个函数,这个函数主要是一个AJAX请求,然后来测试一下返回数据是否正常,然后再看一下我们想要去获取哪些数据;
export const loadSearchResults = async function (query) {
  try {
    const data = await getJSON(`${API_URL}?search=${query}`);
    console.log(data);
  } catch(err) {
    console.error(`${err}😰😰😰`);
    throw err;
  }
};
loadSearchResults('pizza');

在这里插入图片描述

  • 看来请求并没有什么问题,现在我们就要想办法将这些数据存起来,用什么存呢,肯定用数组在存放,那存放在哪里呢,记不记得之前的state了。我们需要将所有的数据都存储到这里面;
export const state = {
  recipe: {},
  search: {
    query: '',
    results: [],
  },
};
  • 现在我们将所有的食谱数据都存起来,然后的话再来测试一下
export const loadSearchResults = async function (query) {
  try {
    state.search.query = query;
    const data = await getJSON(`${API_URL}?search=${query}`);
    console.log(data);

    state.search.results = data.data.recipes.map(rec => {
      return {
        id: rec.id,
        title: rec.title,
        publisher: rec.publisher,
        image: rec.image_url,
      };
    });
    console.log(state.search.results);
  } catch (err) {
    console.error(`${err}😰😰😰`);
    throw err;
  }
};
loadSearchResults('pizza');

在这里插入图片描述

  • 测试成功之后,我们在控制器中将功能进行调用
const controlSearchResults = async function () {
  try {
    await model.loadSearchResults('pizza');
    console.log(model.state.search.results);
  } catch (err) {
    console.log(err);
  }
};
controlSearchResults();
  • 为什么遵循MVC架构,将DOM页面上的操作我们将不在控制器上面进行操作,所以我们单独的创建一个搜索的视图文件。文件简单的一些选择器和监听事件
class SearchView {
  #parentEl = document.querySelector('.search');

  getQuery() {
    return this.#parentEl.querySelector('.search__field').value;
  }
}

export default new SearchView();
  • 接着我们在控制器里进行引入
import searchView from './view/searchView.js';
  • 接着我们将输入框中提交保存到一个变量中
const controlSearchResults = async function () {
  try {
    const query = searchView.getQuery();
    if (!query) return;
    await model.loadSearchResults('pizza');
    console.log(model.state.search.results);
  } catch (err) {
    console.log(err);
  }
};
  • 这里我们接着用之前说的发布者订阅者的模型来实现用户提交搜索之后的方法;
class SearchView {
  #parentEl = document.querySelector('.search');

  getQuery() {
    return this.#parentEl.querySelector('.search_field').value;
  }

  addHandlerSearch(handler) {
    this.#parentEl.addEventListener('submit', function (e) {
      e.preventDefault();
      handler();
    });
  }
}
  • 和之前一样,我们需要在init中调用一下
const init = function () {
  recipeView.addHandlerRender(controlRecipes);
  searchView.addHandlerSearch(controlSearchResults);
};

init();
  • 现在应该是可以了,我们尝试一下

在这里插入图片描述

  • 在尝试一下其他的

在这里插入图片描述

  • 现在我们在每次输入之后清楚一下搜索框的内容
  getQuery() {
    const query = this.#parentEl.querySelector('.search__field').value;
    this.#clearInput();
    return query;
  }

  #clearInput() {
    this.#parentEl.querySelector('.search__field').value = '';
  }
  • 这里就不在进行测试了,尝试一下之后发送提交数据之后搜索框中的文件就会被清除;

第一部分到这里基本上就结束了,第二部分我们会将所有的搜索结果渲染到页面的侧边栏中!

相关文章:

  • 穿越是时空之门(java)
  • Ubuntu安装TensorFlow 2.13-GPU版全流程指南(anaconda)
  • golang中的接口
  • 【Java进阶学习 第九篇】常用API(Array、冒泡选择排序、二分查找、正则表达式)
  • 【C++进阶】指针:从基础到实践
  • Leetcode Hot 100 79.单词搜索
  • 【spring对bean Singleton和Prototype的管理流程】
  • 英伟达GTC 2025大会产品全景剖析与未来路线深度洞察分析
  • 小程序开发中的安全问题及防护措施
  • 蓝桥与力扣刷题(蓝桥 组队)
  • E1-相亲派对(组合)
  • 【AI News | 20250319】每日AI进展
  • @Resource和@Autowire
  • Java 中 LinkedList 的底层数据结构及相关分析
  • 【源码阅读】多个函数抽象为类(实现各种类型文件转为PDF)
  • UE4学习笔记 FPS游戏制作6 添加枪口特效
  • 详细解析GetOpenFileName()
  • Vue3 核心特性解析:Suspense 与 Teleport 原理深度剖析
  • 区块链技术驱动金融第一章 —— 走进区块链的基石:密码学与加密货币
  • 性能测试过程实时监控分析
  • 阿里上季度营收增7%:淘天营收创新高,AI产品营收连续七个季度三位数增长
  • 湃书单|澎湃新闻编辑们在读的14本书:后工作时代
  • 巴菲特谈卸任CEO:开始偶尔失去平衡,但仍然保持敏锐的头脑,仍打算继续工作
  • 75万买299元路由器后续:重庆市纪委、财政局、教委联合调查
  • 检疫期缩减至30天!香港优化内地进口猫狗检疫安排
  • 演员黄晓明、金世佳进入上海戏剧学院2025年博士研究生复试名单