![](/img/trans.png)
[英]How to get shopify filter to only show tags available on products shown?
[英]How to filter products by productType on Shopify?
期望的行為是讓用戶能夠使用菜單中的productType
按產品類型過濾產品。
目前我正在查詢 Shopify 店面 API 並在lib/Shopify.js
中取回產品
export async function getProductsInCollection() {
const query = `
{
collectionByHandle(handle: "frontpage") {
title
products(first: 25) {
edges {
node {
id
title
productType
handle
}
}
}
}
}`
const response = await ShopifyData(query)
const allProducts = response.data.collectionByHandle.products.edges ? response.data.collectionByHandle.products.edges : []
return allProducts
}
export function filter(type) {
let filtredProducts = getProductsInCollection().filter(product => product.node.productType === type);
return filtredProducts;
}
lib/Shopify.js
還包含一個 function 以獲取商店中的所有產品類型。
export async function getProductTypes() {
const query =
`{
shop {
products(first:250, query:"-product_type:''") {
edges {
node {
productType
}
}
}
}
}`
const response = await ShopifyData(query)
const rawProductTypes = response.data.shop.products ? response.data.shop.products.edges : []
const productTypes = Array.from(new Set(rawProductTypes));
return productTypes
}
然后shop.js
循環遍歷所有 productType 並將它們顯示在菜單中。 它還循環遍歷所有產品。
import { getProductsInCollection, getProductTypes, filter } from "../lib/shopify"
import React, { useState, useEffect } from "react";
import Link from 'next/link'
export default function Shop({ products, pages, projects, productTypes }) {
const [filtredProducts, setFiltredProducts] = useState(null);
useEffect(() => {
setFiltredProducts(getProductsInCollection());
}, []);
var categories = new Map();
productTypes.forEach( function( item ) {
categories.set(JSON.stringify(item), item);
});
function handleCategories(e) {
let type = e.target.value;
type !== "all"
? setFiltredProducts(filter(type))
: setFiltredProducts(getProductsInCollection());
}
const deduped = Array.from(new Set(productTypes));
return (
<div>
<div>
{categories &&
[...categories.values()].map((category, index) => (
<>
<button className="mr-8 mb-6 underline" key={index} value={category.node.productType} onClick={handleCategories}>
{category.node.productType}
</button>
</>
))}
{filtredProducts &&
filtredProducts.map(p => (
<ul>
<li>{p.node.title}</li>
</ul>
))}
</div>
</div>
)
}
export async function getStaticProps() {
const products = await getProductsInCollection()
const productTypes = await getProductTypes()
return {
props: {
products,
productTypes,
},
}
}
當用戶嘗試單擊過濾器時,他們會收到以下錯誤。
類型錯誤:getProductsInCollection(...).filter 不是 function
什么是讓過濾器工作的正確方法,以便菜單過濾下面的產品?
您正在嘗試在 Promise 上調用.filter()
,而不是數組。 嘗試像這樣修改您的代碼:
export async function filter(type) {
let products = await getProductsInCollection();
let filteredProducts = products.filter(product => product.node.productType === type);
return filteredProducts;
}
請記住,在調用filter()
時,您需要再次使用await
,因為它現在也是異步 function。
getProductsInCollection 返回 promise,在過濾器之前使用 async/await。
在 shop.js 中,您還必須在設置為 state 之前使用 async/await。
export async function getProductsInCollection() {
const query = `
{
collectionByHandle(handle: "frontpage") {
title
products(first: 25) {
edges {
node {
id
title
productType
handle
}
}
}
}
}`;
const response = await ShopifyData(query);
const allProducts = response.data.collectionByHandle.products.edges
? response.data.collectionByHandle.products.edges
: [];
return allProducts;
}
export async function filter(type) {
let filtredProducts = await getProductsInCollection();
return filtredProducts.filter((product) => product.node.productType === type);
}
// shop.js
async function handleCategories(e) {
let type = e.target.value;
let products = [];
if (type !== "all") {
products = await filter(type);
} else {
products = getProductsInCollection();
}
setFiltredProducts(products);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.