Filters
React 5 Filters plugin
Filters are the best way to select data that meets your requirements - they affect your search results by filtrating and sorting the dataset you pass to our component.
Note: Read the API tab to find all available options and advanced customization
Basic example - JSX Elements
Use filterData and data properties to define elements to filter. This
is required for proper component initialization.
Add filters, filterOptions and handlers for them to every input you want to use as a filter.
Note: You must have at least one filtrable element for a component to work properly.
import React, { useState } from 'react';
import { MDBCol, MDBRow, MDBRadio, MDBBtn, MDBCardText, MDBCardBody, MDBCard } from 'mdb-react-ui-kit';
import { MDBFilters } from 'mdb-react-filters';
export const exampleData = [
{
name: 'Black Jeans Jacket',
price: 100,
color: 'black',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/15.webp',
},
{
name: 'Gray Jumper',
oldPrice: 100,
price: 80,
color: 'gray',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/14.webp',
},
{
name: 'Blue Jeans Jacket',
price: 90,
color: 'blue',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/12.webp',
},
{
name: 'Red Hoodie',
oldPrice: 150,
price: 120,
color: 'red',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/13.webp',
},
{
name: 'Black Jeans Jacket',
price: 100,
color: 'black',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/15.webp',
},
{
name: 'Gray Jumper',
oldPrice: 100,
price: 80,
color: 'gray',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/14.webp',
},
];
export default function App() {
const [basicFilters, setBasicFilters] = useState<{ color: string; sale: boolean | string }>({ color: '', sale: '' });
const [basicData, setBasicData] = useState(exampleData);
const onChangeBasic = (e: any) => {
setBasicFilters({ ...basicFilters, [e.target.name]: e.target.value });
};
return (
<section className='pb-4'>
<div className='bg-white border rounded-5'>
<section className='w-100 p-4 justify-content-center'>
<MDBRow className='justify-content-center'>
<MDBCol md='6'>
<span className='fa-lg'>Filter: Color</span>
<MDBRadio
name='color'
onChange={onChangeBasic}
value='black'
checked={basicFilters.color === 'black'}
label='Black'
wrapperClass='mt-3'
/>
<MDBRadio
name='color'
value='red'
onChange={onChangeBasic}
checked={basicFilters.color === 'red'}
label='Red'
/>
<MDBRadio
name='color'
value='blue'
onChange={onChangeBasic}
checked={basicFilters.color === 'blue'}
label='Blue'
/>
<MDBRadio
name='color'
value='gray'
onChange={onChangeBasic}
checked={basicFilters.color === 'gray'}
label='Gray'
/>
</MDBCol>
<MDBCol md='6'>
<span className='fa-lg mb-5'>Filter: Sale</span>
<MDBRadio
name='sale'
onChange={onChangeBasic}
checked={basicFilters.sale === 'yes'}
value='yes'
label='Yes'
wrapperClass='mt-3'
/>
<MDBRadio
name='sale'
onChange={onChangeBasic}
checked={basicFilters.sale === 'no'}
value='no'
label='No'
/>
<MDBBtn
className='mt-3'
style={{ minWidth: '156px' }}
onClick={() => setBasicFilters({ color: '', sale: '' })}
>
Clear all filters
</MDBBtn>
</MDBCol>
</MDBRow>
<MDBFilters
filterData={setBasicData}
data={exampleData}
filters={basicFilters}
filterOptions={[
{ type: 'radio', key: 'color' },
{ type: 'radio', key: 'sale' },
]}
>
{basicData.map((item, i) => (
<MDBCol key={i} md='4' className='mt-3 basic-example-item'>
<MDBCard className='card shadow-2'>
<img src={item.img} className='card-img-top' alt='...' />
<MDBCardBody>
<h5 className='card-title'>{item.name}</h5>
{item.sale === 'yes' ? (
<MDBCardText>
<span className='text-decoration-line-through'>{item.oldPrice}$</span>{' '}
<span className='fw-bold fa-lg'>{item.price}$</span>
</MDBCardText>
) : (
<MDBCardText className='card-text'>{item.price}$</MDBCardText>
)}
<a href='#' className='btn btn-primary ripple-surface'>
Buy now
</a>
</MDBCardBody>
</MDBCard>
</MDBCol>
))}
</MDBFilters>
</section>
</div>
</section>
);
}
Checkbox example
Note: If there is more than one option, the result of filtering will show items that match both of them.
import React, { useState } from 'react';
import { MDBCol, MDBRow, MDBCheckbox, MDBBtn, MDBCardText, MDBCardBody, MDBCard } from 'mdb-react-ui-kit';
import { MDBFilters } from 'mdb-react-filters';
export const exampleData = [
{
name: 'Black Jeans Jacket',
price: 100,
color: 'black',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/15.webp',
},
{
name: 'Gray Jumper',
oldPrice: 100,
price: 80,
color: 'gray',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/14.webp',
},
{
name: 'Blue Jeans Jacket',
price: 90,
color: 'blue',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/12.webp',
},
{
name: 'Red Hoodie',
oldPrice: 150,
price: 120,
color: 'red',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/13.webp',
},
{
name: 'Black Jeans Jacket',
price: 100,
color: 'black',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/15.webp',
},
{
name: 'Gray Jumper',
oldPrice: 100,
price: 80,
color: 'gray',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/14.webp',
},
];
export default function App() {
const [checkboxFilters, setCheckboxFilters] = useState<{ color: Array<string>; sale: Array<string> }>({
color: [],
sale: [],
});
const [checkboxData, setCheckboxData] = useState(exampleData);
const onChangeCheckbox = (e: { target: { name: keyof typeof checkboxFilters; value: string } }) => {
const containsValue = checkboxFilters[e.target.name].includes(e.target.value);
if (containsValue) {
setCheckboxFilters({
...checkboxFilters,
[e.target.name]: checkboxFilters[e.target.name].filter((element) => element !== e.target.value),
});
} else {
const newArray = [...checkboxFilters[e.target.name], e.target.value];
setCheckboxFilters({ ...checkboxFilters, [e.target.name]: newArray });
}
};
return (
<section className='pb-4'>
<div className='bg-white border rounded-5'>
<section className='w-100 p-4 justify-content-center'>
<MDBRow className='justify-content-center'>
<MDBCol md='6'>
<span className='fa-lg'>Filter: Color</span>
<MDBCheckbox
name='color'
onChange={onChangeCheckbox}
value='black'
checked={checkboxFilters.color.includes('black')}
label='Black'
wrapperClass='mt-3'
/>
<MDBCheckbox
name='color'
value='red'
onChange={onChangeCheckbox}
checked={checkboxFilters.color.includes('red')}
label='Red'
/>
<MDBCheckbox
name='color'
value='blue'
onChange={onChangeCheckbox}
checked={checkboxFilters.color.includes('blue')}
label='Blue'
/>
<MDBCheckbox
name='color'
value='gray'
onChange={onChangeCheckbox}
checked={checkboxFilters.color.includes('gray')}
label='Gray'
/>
</MDBCol>
<MDBCol md='6'>
<span className='fa-lg mb-5'>Filter: Sale</span>
<MDBCheckbox
name='sale'
onChange={onChangeCheckbox}
checked={checkboxFilters.sale.includes('yes')}
value='yes'
label='Yes'
wrapperClass='mt-3'
/>
<MDBCheckbox
name='sale'
onChange={onChangeCheckbox}
checked={checkboxFilters.sale.includes('no')}
value='no'
label='No'
/>
<MDBBtn
className='mt-3'
style={{ minWidth: '156px' }}
onClick={() => setCheckboxFilters({ color: [], sale: [] })}
>
Clear all filters
</MDBBtn>
</MDBCol>
</MDBRow>
<MDBFilters
filterData={setCheckboxData}
data={exampleData}
filters={checkboxFilters}
filterOptions={[
{ type: 'checkbox', key: 'color' },
{ type: 'checkbox', key: 'sale' },
]}
>
{checkboxData.map((item, i) => (
<MDBCol key={i} md='4' className='mt-3 basic-example-item'>
<MDBCard className='card shadow-2'>
<img src={item.img} className='card-img-top' alt='...' />
<MDBCardBody>
<h5 className='card-title'>{item.name}</h5>
{item.sale === 'yes' ? (
<MDBCardText>
<span className='text-decoration-line-through'>{item.oldPrice}$</span>{' '}
<span className='fw-bold fa-lg'>{item.price}$</span>
</MDBCardText>
) : (
<MDBCardText className='card-text'>{item.price}$</MDBCardText>
)}
<a href='#' className='btn btn-primary ripple-surface'>
Buy now
</a>
</MDBCardBody>
</MDBCard>
</MDBCol>
))}
</MDBFilters>
</section>
</div>
</section>
);
}
Color example
import React, { useEffect, useState } from 'react';
import { MDBCol, MDBRow, MDBRadio, MDBBtn, MDBCardText, MDBCardBody, MDBCard, MDBRipple } from 'mdb-react-ui-kit';
import { MDBFilters } from 'mdb-react-filters';
export const exampleData = [
{
name: 'Black Jeans Jacket',
price: 100,
color: 'black',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/15.webp',
},
{
name: 'Gray Jumper',
oldPrice: 100,
price: 80,
color: 'gray',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/14.webp',
},
{
name: 'Blue Jeans Jacket',
price: 90,
color: 'blue',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/12.webp',
},
{
name: 'Red Hoodie',
oldPrice: 150,
price: 120,
color: 'red',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/13.webp',
},
{
name: 'Black Jeans Jacket',
price: 100,
color: 'black',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/15.webp',
},
{
name: 'Gray Jumper',
oldPrice: 100,
price: 80,
color: 'gray',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/14.webp',
},
];
export default function App() {
const [colorFilters, setColorFilters] = useState<{ color: string }>({ color: '' });
const [colorData, setColorData] = useState(exampleData);
const onChangeColor = (e: any) => {
setColorFilters({ ...colorFilters, [e.target.name]: e.target.value });
};
return (
<section className='pb-4'>
<div className='bg-white border rounded-5'>
<section className='w-100 p-4 justify-content-center'>
<MDBRow className='justify-content-center'>
<MDBCol className='text-center mb-3' md='12'>
<p className='fa-lg mb-4'>Filter: Color</p>
<div className='form-check form-check-inline'>
<input
onChange={onChangeColor}
checked={colorFilters.color === 'red'}
className='btn-check'
type='radio'
name='color'
id='colorRadio1'
value='red'
/>
<MDBRipple
rippleTag='label'
className='btn bg-danger btn-rounded p-4 '
htmlFor='colorRadio1'
style={{ minWidth: '48px' }}
></MDBRipple>
</div>
<div className='form-check form-check-inline'>
<input
onChange={onChangeColor}
checked={colorFilters.color === 'blue'}
className='btn-check'
type='radio'
name='color'
id='colorRadio2'
value='blue'
/>
<MDBRipple
rippleTag='label'
className='btn bg-primary btn-rounded p-4 '
htmlFor='colorRadio2'
style={{ minWidth: '48px' }}
></MDBRipple>
</div>
<div className='form-check form-check-inline'>
<input
onChange={onChangeColor}
checked={colorFilters.color === 'black'}
className='btn-check'
type='radio'
name='color'
id='colorRadio3'
value='black'
/>
<MDBRipple
rippleTag='label'
className='btn bg-dark text-white btn-rounded p-4 '
htmlFor='colorRadio3'
style={{ minWidth: '48px' }}
></MDBRipple>
</div>
<div className='form-check form-check-inline'>
<input
onChange={onChangeColor}
checked={colorFilters.color === 'gray'}
className='btn-check'
type='radio'
name='color'
id='colorRadio4'
value='gray'
/>
<MDBRipple
rippleTag='label'
className='btn btn-rounded p-4 '
htmlFor='colorRadio4'
style={{ backgroundColor: 'rgb(189, 189, 189)', minWidth: '48px' }}
></MDBRipple>
</div>
</MDBCol>
<MDBCol md='12' className='text-center my-3'>
<MDBBtn onClick={() => setColorFilters({ color: '' })} style={{ minWidth: '155px' }}>
Clear all filters
</MDBBtn>
</MDBCol>
</MDBRow>
<MDBFilters
filterData={setColorData}
data={exampleData}
filters={colorFilters}
filterOptions={[{ type: 'radio', key: 'color' }]}
>
{colorData.map((item, i) => (
<MDBCol key={i} md='4' className='mt-3 color-example-item'>
<MDBCard className='card shadow-2'>
<img src={item.img} className='card-img-top' alt='...' />
<MDBCardBody>
<h5 className='card-title'>{item.name}</h5>
{item.sale === 'yes' ? (
<MDBCardText>
<span className='text-decoration-line-through'>{item.oldPrice}$</span>{' '}
<span className='fw-bold fa-lg'>{item.price}$</span>
</MDBCardText>
) : (
<MDBCardText className='card-text'>{item.price}$</MDBCardText>
)}
<a href='#' className='btn btn-primary ripple-surface'>
Buy now
</a>
</MDBCardBody>
</MDBCard>
</MDBCol>
))}
</MDBFilters>
</section>
</div>
</section>
);
}
Size example
import React, { useState } from 'react';
import { MDBCol, MDBRow, MDBCheckbox, MDBBtn, MDBCardText, MDBCardBody, MDBCard, MDBRadio } from 'mdb-react-ui-kit';
import { MDBFilters } from 'mdb-react-filters';
const sizeData = [
{
name: 'Black Jeans Jacket',
price: 100,
color: 'black',
size: '42',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/15.webp',
},
{
name: 'Gray Jumper',
oldPrice: 100,
price: 80,
color: 'gray',
size: '36',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/14.webp',
},
{
name: 'Blue Jeans Jacket',
price: 90,
color: 'blue',
size: '42',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/12.webp',
},
{
name: 'Red Hoodie',
oldPrice: 150,
price: 120,
color: 'red',
size: '40',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/13.webp',
},
{
name: 'Black Jeans Jacket',
price: 100,
color: 'black',
size: '38',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/15.webp',
},
{
name: 'Gray Jumper',
oldPrice: 100,
price: 80,
color: 'gray',
size: '36',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/14.webp',
},
];
export default function App() {
const [sizeFilters, setSizeFilters] = useState<{ size: Array<string>; sale: string }>({
size: [],
sale: '',
});
const [checkboxData, setCheckboxData] = useState(sizeData);
const onChangeCheckbox = (e: { target: { name: keyof typeof sizeFilters; value: string } }) => {
const containsValue = sizeFilters[e.target.name].includes(e.target.value);
if (containsValue) {
setSizeFilters({
...sizeFilters,
[e.target.name]: sizeFilters.size.filter((element) => element !== e.target.value),
});
} else {
const newArray = [...sizeFilters.size, e.target.value];
setSizeFilters({ ...sizeFilters, [e.target.name]: newArray });
}
};
const onChangeRadio = (e: any) => {
setSizeFilters({ ...sizeFilters, [e.target.name]: e.target.value });
};
return (
<section className='pb-4'>
<div className='bg-white border rounded-5'>
<section className='w-100 p-4 justify-content-center'>
<MDBRow className='justify-content-center'>
<MDBCol md='6'>
<span className='fa-lg'>Filter: Color</span>
<MDBCheckbox
name='size'
onChange={onChangeCheckbox}
value='36'
checked={sizeFilters.size.includes('36')}
label='36'
wrapperClass='mt-3'
/>
<MDBCheckbox
name='size'
value='38'
onChange={onChangeCheckbox}
checked={sizeFilters.size.includes('38')}
label='38'
/>
<MDBCheckbox
name='size'
value='40'
onChange={onChangeCheckbox}
checked={sizeFilters.size.includes('40')}
label='40'
/>
<MDBCheckbox
name='size'
value='42'
onChange={onChangeCheckbox}
checked={sizeFilters.size.includes('42')}
label='42'
/>
</MDBCol>
<MDBCol md='6'>
<span className='fa-lg mb-5'>Filter: Sale</span>
<MDBRadio
name='sale'
onChange={onChangeRadio}
checked={sizeFilters.sale === 'yes'}
value='yes'
label='Yes'
wrapperClass='mt-3'
/>
<MDBRadio
name='sale'
onChange={onChangeRadio}
checked={sizeFilters.sale === 'no'}
value='no'
label='No'
/>
<MDBBtn
className='mt-3'
style={{ minWidth: '156px' }}
onClick={() => setSizeFilters({ size: [], sale: '' })}
>
Clear all filters
</MDBBtn>
</MDBCol>
</MDBRow>
<MDBFilters
filterData={setCheckboxData}
data={sizeData}
filters={sizeFilters}
filterOptions={[
{ type: 'checkbox', key: 'size' },
{ type: 'radio', key: 'sale' },
]}
>
{checkboxData.map((item, i) => (
<MDBCol key={i} md='4' className='mt-3 basic-example-item'>
<MDBCard className='card shadow-2'>
<img src={item.img} className='card-img-top' alt='...' />
<MDBCardBody>
<h5 className='card-title'>{item.name}</h5>
{item.sale === 'yes' ? (
<MDBCardText>
<span className='text-decoration-line-through'>{item.oldPrice}$</span>{' '}
<span className='fw-bold fa-lg'>{item.price}$</span>
</MDBCardText>
) : (
<MDBCardText className='card-text'>{item.price}$</MDBCardText>
)}
<a href='#' className='btn btn-primary ripple-surface'>
Buy now
</a>
</MDBCardBody>
</MDBCard>
</MDBCol>
))}
</MDBFilters>
</section>
</div>
</section>
);
}
Animations with DOM Elements
Wrap filtrable elements in MDBAnimation component to
animate them. The full list of available options you can find
here.
import React, { useEffect, useState } from 'react';
import { MDBCol, MDBRow, MDBRadio, MDBBtn, MDBCardText, MDBCardBody, MDBCard, MDBAnimation } from 'mdb-react-ui-kit';
import { MDBFilters } from 'mdb-react-filters';
const exampleData = [
{
name: 'Black Jeans Jacket',
price: 100,
color: 'black',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/15.webp',
},
{
name: 'Gray Jumper',
oldPrice: 100,
price: 80,
color: 'gray',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/14.webp',
},
{
name: 'Blue Jeans Jacket',
price: 90,
color: 'blue',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/12.webp',
},
{
name: 'Red Hoodie',
oldPrice: 150,
price: 120,
color: 'red',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/13.webp',
},
{
name: 'Black Jeans Jacket',
price: 100,
color: 'black',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/15.webp',
},
{
name: 'Gray Jumper',
oldPrice: 100,
price: 80,
color: 'gray',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/14.webp',
},
];
export default function App() {
const [basicFilters, setBasicFilters] = useState<{ color: string; sale: boolean | string }>({ color: '', sale: '' });
const [basicData, setBasicData] = useState(exampleData);
const onChangeBasic = (e: any) => {
setBasicFilters({ ...basicFilters, [e.target.name]: e.target.value });
};
return (
<section className='pb-4'>
<div className='bg-white border rounded-5'>
<section className='w-100 p-4 justify-content-center'>
<MDBRow className='justify-content-center'>
<MDBCol md='6'>
<span className='fa-lg'>Filter: Color</span>
<MDBRadio
name='color'
onChange={onChangeBasic}
value='black'
checked={basicFilters.color === 'black'}
label='Black'
wrapperClass='mt-3'
/>
<MDBRadio
name='color'
value='red'
onChange={onChangeBasic}
checked={basicFilters.color === 'red'}
label='Red'
/>
<MDBRadio
name='color'
value='blue'
onChange={onChangeBasic}
checked={basicFilters.color === 'blue'}
label='Blue'
/>
<MDBRadio
name='color'
value='gray'
onChange={onChangeBasic}
checked={basicFilters.color === 'gray'}
label='Gray'
/>
</MDBCol>
<MDBCol md='6'>
<span className='fa-lg mb-5'>Filter: Sale</span>
<MDBRadio
name='sale'
onChange={onChangeBasic}
checked={basicFilters.sale === 'yes'}
value='yes'
label='Yes'
wrapperClass='mt-3'
/>
<MDBRadio
name='sale'
onChange={onChangeBasic}
checked={basicFilters.sale === 'no'}
value='no'
label='No'
/>
<MDBBtn
className='mt-3'
style={{ minWidth: '156px' }}
onClick={() => setBasicFilters({ color: '', sale: '' })}
>
Clear all filters
</MDBBtn>
</MDBCol>
</MDBRow>
<MDBFilters
filterData={setBasicData}
data={exampleData}
filters={basicFilters}
filterOptions={[
{ type: 'radio', key: 'color' },
{ type: 'radio', key: 'sale' },
]}
>
{basicData.map((item, i) => (
<MDBCol key={i} md='4' className='mt-3 basic-example-item'>
<MDBAnimation key={Math.random()} animation='fade-in' start='onLoad' tag='div'>
<MDBCard className='card shadow-2'>
<img src={item.img} className='card-img-top' alt='...' />
<MDBCardBody>
<h5 className='card-title'>{item.name}</h5>
{item.sale === 'yes' ? (
<MDBCardText>
<span className='text-decoration-line-through'>{item.oldPrice}$</span>{' '}
<span className='fw-bold fa-lg'>{item.price}$</span>
</MDBCardText>
) : (
<MDBCardText className='card-text'>{item.price}$</MDBCardText>
)}
<a href='#' className='btn btn-primary ripple-surface'>
Buy now
</a>
</MDBCardBody>
</MDBCard>
</MDBAnimation>
</MDBCol>
))}
</MDBFilters>
</section>
</div>
</section>
);
}
Filter and sort
import React, { useEffect, useState } from 'react';
import { MDBCol, MDBRow, MDBRadio, MDBBtn, MDBCardText, MDBCardBody, MDBCard, MDBSelect } from 'mdb-react-ui-kit';
import { MDBFilters } from 'mdb-react-filters';
const exampleData = [
{
name: 'Black Jeans Jacket',
price: 100,
color: 'black',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/15.webp',
},
{
name: 'Gray Jumper',
oldPrice: 100,
price: 80,
color: 'gray',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/14.webp',
},
{
name: 'Blue Jeans Jacket',
price: 90,
color: 'blue',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/12.webp',
},
{
name: 'Red Hoodie',
oldPrice: 150,
price: 120,
color: 'red',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/13.webp',
},
{
name: 'Black Jeans Jacket',
price: 100,
color: 'black',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/15.webp',
},
{
name: 'Gray Jumper',
oldPrice: 100,
price: 80,
color: 'gray',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/14.webp',
},
];
export default function App() {
const [basicFilters, setBasicFilters] = useState<{ color: string; sale: boolean | string }>({ color: '', sale: '' });
const [basicData, setBasicData] = useState(exampleData);
const [sort, setSort] = useState({ sortProperty: '', order: 'asc' });
const onChangeBasic = (e: any) => {
setBasicFilters({ ...basicFilters, [e.target.name]: e.target.value });
};
const handleGetValue = (e: any) => {
const value = e;
if (value === 1) {
setSort({ sortProperty: 'name', order: 'asc' });
}
if (value === 2) {
setSort({ sortProperty: 'name', order: 'desc' });
}
if (value === 3) {
setSort({ sortProperty: 'price', order: 'desc' });
}
if (value === 4) {
setSort({ sortProperty: 'price', order: 'asc' });
}
};
return (
<section className='pb-4'>
<div className='bg-white border rounded-5'>
<section className='w-100 p-4 justify-content-center'>
<MDBRow className='justify-content-center'>
<MDBCol md='6'>
<span className='fa-lg'>Filter: Color</span>
<MDBRadio
name='color'
onChange={onChangeBasic}
value='black'
checked={basicFilters.color === 'black'}
label='Black'
wrapperClass='mt-3'
/>
<MDBRadio
name='color'
value='red'
onChange={onChangeBasic}
checked={basicFilters.color === 'red'}
label='Red'
/>
<MDBRadio
name='color'
value='blue'
onChange={onChangeBasic}
checked={basicFilters.color === 'blue'}
label='Blue'
/>
<MDBRadio
name='color'
value='gray'
onChange={onChangeBasic}
checked={basicFilters.color === 'gray'}
label='Gray'
/>
</MDBCol>
<MDBCol md='6'>
<span className='fa-lg mb-5'>Filter: Sale</span>
<MDBRadio
name='sale'
onChange={onChangeBasic}
checked={basicFilters.sale === 'yes'}
value='yes'
label='Yes'
wrapperClass='mt-3'
/>
<MDBRadio
name='sale'
onChange={onChangeBasic}
checked={basicFilters.sale === 'no'}
value='no'
label='No'
/>
<MDBBtn
className='mt-3'
style={{ minWidth: '156px' }}
onClick={() => setBasicFilters({ color: '', sale: '' })}
>
Clear all filters
</MDBBtn>
</MDBCol>
<MDBCol md='8' className='my-5'>
<MDBSelect
getSelectedValue={handleGetValue}
data={[
{ text: 'Choose category', value: '', disabled: true },
{ text: 'Product name ascending', value: 1, selected: true },
{ text: 'Product name descending', value: 2 },
{ text: 'Highest price', value: 3 },
{ text: 'Lowest price', value: 4 },
]}
/>
</MDBCol>
</MDBRow>
<MDBFilters
filteredData={basicData}
filterData={setBasicData}
sortOptions={sort}
data={exampleData}
filters={basicFilters}
filterOptions={[
{ type: 'radio', key: 'color' },
{ type: 'radio', key: 'sale' },
]}
>
{basicData.map((item, i) => (
<MDBCol key={i} md='4' className='mt-3 basic-example-item'>
<MDBCard className='card shadow-2'>
<img src={item.img} className='card-img-top' alt='...' />
<MDBCardBody>
<h5 className='card-title'>{item.name}</h5>
{item.sale === 'yes' ? (
<MDBCardText>
<span className='text-decoration-line-through'>{item.oldPrice}$</span>{' '}
<span className='fw-bold fa-lg'>{item.price}$</span>
</MDBCardText>
) : (
<MDBCardText className='card-text'>{item.price}$</MDBCardText>
)}
<a href='#' className='btn btn-primary ripple-surface'>
Buy now
</a>
</MDBCardBody>
</MDBCard>
</MDBCol>
))}
</MDBFilters>
</section>
</div>
</section>
);
}
Customization - custom filter
import React, { useEffect, useState } from 'react';
import { MDBCol, MDBRow, MDBRadio, MDBBtn, MDBCardText, MDBCardBody, MDBCard, MDBRange } from 'mdb-react-ui-kit';
import { MDBFilters } from 'mdb-react-filters';
const exampleData = [
{
name: 'Black Jeans Jacket',
price: 100,
color: 'black',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/15.webp',
},
{
name: 'Gray Jumper',
oldPrice: 100,
price: 80,
color: 'gray',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/14.webp',
},
{
name: 'Blue Jeans Jacket',
price: 90,
color: 'blue',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/12.webp',
},
{
name: 'Red Hoodie',
oldPrice: 150,
price: 120,
color: 'red',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/13.webp',
},
{
name: 'Black Jeans Jacket',
price: 100,
color: 'black',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/15.webp',
},
{
name: 'Gray Jumper',
oldPrice: 100,
price: 80,
color: 'gray',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/14.webp',
},
];
export default function App() {
const [customFilters, setCustomFilters] = useState({ min: 80, max: 120 });
const [basicData, setBasicData] = useState(exampleData);
const onChange = (e: any) => {
setCustomFilters({ ...customFilters, [e.target.name]: e.target.value });
};
return (
<section className='pb-4'>
<div className='bg-white border rounded-5'>
<section className='w-100 p-4 justify-content-center'>
<MDBRow className='justify-content-center'>
<MDBCol className='col-md-12 mt-3 text-center'>
<p className='fa-lg'>Price:</p>
<MDBRange name='min' min='80' max='120' value={customFilters.min} label='Min' onChange={onChange} />
<p id='min-val'>Current: {customFilters.min}$</p>
<MDBRange name='max' min='80' max='120' value={customFilters.max} label='Max' onChange={onChange} />
<p id='max-val'>Current: {customFilters.max}$</p>
</MDBCol>
</MDBRow>
<MDBFilters
filterData={setBasicData}
data={exampleData}
filters={customFilters}
filterOptions={[
{
type: 'custom',
key: 'min',
custom: (data, key, filter) => {
return data.filter((item: any) =>
item.salePrice ? item.salePrice >= filter : item.price >= filter
);
},
},
{
type: 'custom',
key: 'max',
custom: (data, key, filter) => {
return data.filter((item: any) =>
item.salePrice ? item.salePrice <= filter : item.price <= filter
);
},
},
]}
>
{basicData.map((item, i) => (
<MDBCol key={i} md='4' className='mt-3 basic-example-item'>
<MDBCard className='card shadow-2'>
<img src={item.img} className='card-img-top' alt='...' />
<MDBCardBody>
<h5 className='card-title'>{item.name}</h5>
{item.sale === 'yes' ? (
<MDBCardText>
<span className='text-decoration-line-through'>{item.oldPrice}$</span>{' '}
<span className='fw-bold fa-lg'>{item.price}$</span>
</MDBCardText>
) : (
<MDBCardText className='card-text'>{item.price}$</MDBCardText>
)}
<a href='#' className='btn btn-primary ripple-surface'>
Buy now
</a>
</MDBCardBody>
</MDBCard>
</MDBCol>
))}
</MDBFilters>
</section>
</div>
</section>
);
}
Custom sort
import React, { useEffect, useState } from 'react';
import { MDBCol, MDBRow, MDBRadio, MDBBtn, MDBCardText, MDBCardBody, MDBCard, MDBSelect } from 'mdb-react-ui-kit';
import { MDBFilters } from 'mdb-react-filters';
const exampleData = [
{
name: 'Black Jeans Jacket',
price: 100,
color: 'black',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/15.webp',
},
{
name: 'Gray Jumper',
oldPrice: 100,
price: 80,
color: 'gray',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/14.webp',
},
{
name: 'Blue Jeans Jacket',
price: 90,
color: 'blue',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/12.webp',
},
{
name: 'Red Hoodie',
oldPrice: 150,
price: 120,
color: 'red',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/13.webp',
},
{
name: 'Black Jeans Jacket',
price: 100,
color: 'black',
sale: 'no',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/15.webp',
},
{
name: 'Gray Jumper',
oldPrice: 100,
price: 80,
color: 'gray',
sale: 'yes',
img: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/14.webp',
},
];
export default function App() {
const [basicData, setBasicData] = useState(exampleData);
const [sort, setSort] = useState({
sortProperty: 'name',
order: 'asc',
customSort: (firstItem: string, secondItem: string) => {
if (firstItem < secondItem) return -1;
if (firstItem > secondItem) return 1;
return 0;
},
});
return (
<section className='pb-4'>
<div className='bg-white border rounded-5'>
<section className='w-100 p-4 justify-content-center'>
<MDBRow className='justify-content-center'>
<MDBCol md='4' className='text-center'>
<MDBBtn
onClick={() =>
setSort({
...sort,
order: 'asc',
customSort: (firstItem, secondItem) => {
if (firstItem < secondItem) return -1;
if (firstItem > secondItem) return 1;
return 0;
},
})
}
>
Sort by product name ascending
</MDBBtn>
</MDBCol>
<MDBCol md='4' className='text-center'>
<MDBBtn
onClick={() =>
setSort({
...sort,
order: 'desc',
customSort: (firstItem, secondItem) => {
if (firstItem > secondItem) return -1;
if (firstItem < secondItem) return 1;
return 0;
},
})
}
>
Sort by product name descending
</MDBBtn>
</MDBCol>
</MDBRow>
<MDBFilters filteredData={basicData} filterData={setBasicData} sortOptions={sort} data={exampleData}>
{basicData.map((item, i) => (
<MDBCol key={i} md='4' className='mt-3 basic-example-item'>
<MDBCard className='card shadow-2'>
<img src={item.img} className='card-img-top' alt='...' />
<MDBCardBody>
<h5 className='card-title'>{item.name}</h5>
{item.sale === 'yes' ? (
<MDBCardText>
<span className='text-decoration-line-through'>{item.oldPrice}$</span>{' '}
<span className='fw-bold fa-lg'>{item.price}$</span>
</MDBCardText>
) : (
<MDBCardText className='card-text'>{item.price}$</MDBCardText>
)}
<a href='#' className='btn btn-primary ripple-surface'>
Buy now
</a>
</MDBCardBody>
</MDBCard>
</MDBCol>
))}
</MDBFilters>
</section>
</div>
</section>
);
}
Full screen example
import { MDBFilters } from 'mdb-react-filters';
import {
MDBContainer,
MDBNavbar,
MDBNavbarToggler,
MDBIcon,
MDBCollapse,
MDBDropdownMenu,
MDBNavbarLink,
MDBNavbarItem,
MDBBtn,
MDBDropdownItem,
MDBDropdownToggle,
MDBDropdown,
MDBDropdownLink,
MDBNavbarNav,
MDBBadge,
MDBRow,
MDBCol,
MDBSelect,
MDBAnimation,
MDBCheckbox,
MDBRating,
MDBRatingElement,
MDBRadio,
MDBRipple,
MDBFooter,
} from 'mdb-react-ui-kit';
import React, { useState } from 'react';
const advancedData = [
{
id: 1,
category: 'shirts',
name: 'Fantasy T-shirt',
rating: 4,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/12.webp',
description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['34', '36', '40'],
condition: 'new',
color: 'blue',
price: 12.99,
keywords: ['t-shirt', 'sweatshitrt'],
discount: 0,
gender: 'male',
},
{
id: 2,
category: 'shirts',
name: 'Fantasy T-shirt',
rating: 5,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/13.webp',
description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['34', '36', '40', '44'],
condition: 'new',
color: 'red',
price: 12.99,
discount: 0,
gender: 'male',
},
{
id: 3,
category: 'shirts',
name: 'Fantasy T-shirt',
rating: 3,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/14.webp',
description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['34', '36'],
condition: 'new',
color: 'grey',
price: 40.99,
discount: 10,
gender: 'male',
},
{
id: 4,
category: 'jackets',
name: 'Denim Jacket',
rating: 5,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/15.webp',
description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['34', '36', '40'],
condition: 'new',
color: 'grey',
price: 40.99,
discount: 0,
gender: 'unisex',
},
{
id: 5,
category: 'jeans',
name: 'Ripped jeans',
rating: 5,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/11.webp',
description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['34', '36', '38', '40'],
condition: 'renewed',
color: 'blue',
price: 20.99,
discount: 5,
gender: 'female',
},
{
id: 6,
category: 'jeans',
name: 'Boyfriend jeans',
rating: 4,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/10.webp',
description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: false,
size: ['34', '36', '38', '40'],
condition: 'used',
color: 'blue',
price: 20.99,
discount: 5,
gender: 'female',
},
{
id: 7,
category: 'shirts',
name: 'Ripped sweatshirt',
rating: 4,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/7.webp',
description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['34', '36', '38', '40'],
condition: 'collectible',
color: 'white',
price: 29.99,
discount: 5,
gender: 'female',
},
{
id: 8,
category: 'shirts',
name: 'Longsleeve',
rating: 4,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/8.webp',
description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['40'],
condition: 'collectible',
color: 'black',
price: 120.99,
discount: 0,
gender: 'male',
},
{
id: 8,
category: 'shirts',
name: 'Stripped sweatshirt',
rating: 4,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/6.webp',
description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['40', '38', '36'],
condition: 'new',
color: 'white',
price: 32.99,
discount: 10,
gender: 'female',
},
{
id: 9,
category: 'trousers',
name: 'Red chinos',
rating: 5,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/5.webp',
description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['40', '38', '36'],
condition: 'new',
color: 'red',
price: 62.99,
discount: 10,
gender: 'female',
},
{
id: 10,
category: 'coats',
name: 'Camel coat',
rating: 5,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/4.webp',
description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['40', '38', '36'],
condition: 'used',
color: 'brown',
price: 62.99,
discount: 10,
gender: 'female',
},
{
id: 11,
category: 'jeans',
name: 'Blue jeans',
rating: 5,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/3.webp',
description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['40', '38', '36'],
condition: 'new',
color: 'blue',
price: 42.99,
discount: 0,
gender: 'female',
},
{
id: 12,
category: 'shirts',
name: 'Orange T-shirt',
rating: 3,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/3.webp',
description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['40', '38', '36'],
condition: 'new',
color: 'orange',
price: 12.99,
discount: 0,
gender: 'female',
},
{
id: 13,
category: 'skirts',
name: 'Ballerina skirt',
rating: 4,
image: 'https://mdbootstrap.com/img/Photos/Horizontal/E-commerce/Vertical/2.webp',
description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam, sapiente illo. Sit error voluptas repellat rerum quidem, soluta enim perferendis voluptates laboriosam.',
available: true,
size: ['38', '36'],
condition: 'collectible',
color: 'white',
price: 12.99,
discount: 0,
gender: 'female',
},
];
export default function App() {
const [showNavText, setShowNavText] = useState(false);
const [filterData, setFilterData] = useState(advancedData);
const [sort, setSort] = useState({ sortProperty: '', order: 'asc' });
const [filters, setFilters] = useState<{
condition: Array<string>;
size: Array<string>;
rating: number;
price: { min: number; max: number };
color: string;
}>({ condition: [], rating: 0, price: { min: 0, max: Infinity }, size: [], color: '' });
const handleGetValue = (e: any) => {
const value = e;
if (value === 1) {
setSort({ sortProperty: 'rating', order: 'desc' });
}
if (value === 2) {
setSort({ sortProperty: 'price', order: 'asc' });
}
if (value === 3) {
setSort({ sortProperty: 'price', order: 'desc' });
}
};
const onChangeCheckbox = (e: { target: { name: keyof typeof filters; value: string } }) => {
const containsValue = (filters[e.target.name] as Array<string>).includes(e.target.value);
if (containsValue) {
setFilters({
...filters,
[e.target.name]: (filters[e.target.name] as Array<string>).filter((element) => element !== e.target.value),
});
} else {
const newArray = [...(filters[e.target.name] as Array<string>), e.target.value];
setFilters({ ...filters, [e.target.name]: newArray });
}
};
const onChangeRadio = (e: any) => {
const values = e.target.value.split('-');
setFilters({ ...filters, [e.target.name]: { min: parseInt(values[0]), max: parseInt(values[1]) } });
};
const onChangeColor = (e: any) => {
setFilters({ ...filters, [e.target.name]: e.target.value });
};
return (
<>
<header>
<MDBNavbar sticky expand='lg' light className='bg-light'>
<MDBContainer fluid className='justify-content-between'>
<MDBNavbarToggler
type='button'
data-target='#navbarText'
aria-controls='navbarText'
aria-expanded='false'
aria-label='Toggle navigation'
onClick={() => setShowNavText(!showNavText)}
>
<MDBIcon icon='bars' fas />
</MDBNavbarToggler>
<a className='navbar-brand' href='https://mdbecommerce.com/'>
<MDBIcon fab icon='mdb' className='fa-2x' />
</a>
<MDBCollapse navbar show={showNavText}>
<MDBNavbarNav className='ml-auto'>
<MDBNavbarItem className='nav-item my-auto'>
<a className='nav-link active' aria-current='page' href='#'>
<MDBBadge className='rounded-pill' color='danger'>
1
</MDBBadge>
<MDBIcon fas icon='shopping-cart' />
</a>
</MDBNavbarItem>
<MDBDropdown className='nav-item my-auto'>
<MDBDropdownToggle className='nav-link' tag='a'>
<i className='flag-united-kingdom flag m-0'></i>
</MDBDropdownToggle>
<MDBDropdownMenu>
<MDBDropdownItem>
<MDBDropdownLink>Action</MDBDropdownLink>
</MDBDropdownItem>
<MDBDropdownItem>
<MDBDropdownLink>Another action</MDBDropdownLink>
</MDBDropdownItem>
<MDBDropdownItem>
<MDBDropdownLink>Something else here</MDBDropdownLink>
</MDBDropdownItem>
</MDBDropdownMenu>
</MDBDropdown>
<MDBNavbarItem className='my-auto'>
<MDBNavbarLink>Shop</MDBNavbarLink>
</MDBNavbarItem>
<MDBNavbarItem className='my-auto'>
<MDBNavbarLink>Contact</MDBNavbarLink>
</MDBNavbarItem>
<MDBNavbarItem className='my-auto'>
<MDBNavbarLink>Sign in</MDBNavbarLink>
</MDBNavbarItem>
<MDBNavbarItem>
<MDBNavbarLink>
<MDBBtn outline color='dark' rounded>
Sign up
</MDBBtn>
</MDBNavbarLink>
</MDBNavbarItem>
</MDBNavbarNav>
</MDBCollapse>
</MDBContainer>
</MDBNavbar>
<div
className='p-5 text-center bg-image'
style={{
backgroundImage: "url('https://mdbootstrap.com/img/Photos/Others/clothes(5)-crop.webp')",
height: '400px',
}}
>
<div className='mask' style={{ backgroundColor: 'rgba(0, 0, 0, 0.7)' }}>
<div className='d-flex justify-content-center align-items-center h-100'>
<div className='text-white'>
<h1 className='mb-3'>Shop</h1>
</div>
</div>
</div>
</div>
</header>
<main>
<MDBContainer className='mt-5'>
<MDBRow>
<MDBCol md='4'>
<section>
<h5>Filters</h5>
<section className='mb-4'>
<h6 className='font-weight-bold mb-3'>Condition</h6>
<MDBCheckbox
name='condition'
onChange={onChangeCheckbox}
value='new'
checked={filters.condition.includes('new')}
label='NEW'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
<MDBCheckbox
name='condition'
onChange={onChangeCheckbox}
value='used'
checked={filters.condition.includes('used')}
label='USED'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
<MDBCheckbox
name='condition'
onChange={onChangeCheckbox}
value='collectible'
checked={filters.condition.includes('collectible')}
label='COLLECTIBLE'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
<MDBCheckbox
name='condition'
onChange={onChangeCheckbox}
value='renewed'
checked={filters.condition.includes('renewed')}
label='RENEWED'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
</section>
<section className='mb-4'>
<h6 className='font-weight-bold mb-3'>Avg. Customer Review</h6>
<MDBRating
active={filters.rating}
setActive={(value: number) => setFilters({ ...filters, rating: value })}
>
<MDBRatingElement title='1' itemId={1} icon='star' />
<MDBRatingElement title='2' itemId={2} icon='star' />
<MDBRatingElement title='3' itemId={3} icon='star' />
<MDBRatingElement title='4' itemId={4} icon='star' />
<MDBRatingElement title='5' itemId={5} icon='star' />
</MDBRating>
</section>
<section className='mb-4'>
<h6 className='font-weight-bold mb-3'>Price</h6>
<MDBRadio
name='price'
onChange={onChangeRadio}
value='0-25'
checked={JSON.stringify(filters.price) === JSON.stringify({ min: 0, max: 25 })}
label='UNDER $25'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
<MDBRadio
name='price'
onChange={onChangeRadio}
value='25-50'
checked={JSON.stringify(filters.price) === JSON.stringify({ min: 25, max: 50 })}
label='$25 TO $50'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
<MDBRadio
name='price'
value='50-100'
onChange={onChangeRadio}
checked={JSON.stringify(filters.price) === JSON.stringify({ min: 50, max: 100 })}
label='$50 TO $100'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
<MDBRadio
name='price'
value='100-200'
onChange={onChangeRadio}
checked={JSON.stringify(filters.price) === JSON.stringify({ min: 100, max: 200 })}
label='$100 TO $200'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
<MDBRadio
name='price'
value='200-'
onChange={onChangeRadio}
checked={JSON.stringify(filters.price) === JSON.stringify({ min: 200, max: Infinity })}
label='$200 & ABOVE'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
</section>
<section className='mb-4'>
<h6 className='font-weight-bold mb-3'>Price</h6>
<MDBCheckbox
name='size'
value='34'
onChange={onChangeCheckbox}
checked={filters.size.includes('34')}
label='34'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
<MDBCheckbox
name='size'
onChange={onChangeCheckbox}
value='36'
checked={filters.size.includes('36')}
label='36'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
<MDBCheckbox
name='size'
value='38'
onChange={onChangeCheckbox}
checked={filters.size.includes('38')}
label='38'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
<MDBCheckbox
name='size'
value='40'
onChange={onChangeCheckbox}
checked={filters.size.includes('40')}
label='40'
labelClass='text-muted small'
wrapperClass='mb-3'
/>
</section>
<section className='mb-4'>
<h6 className='font-weight-bold mb-3'>Color</h6>
<div className='form-check form-check-inline m-0 p-0 pr-3'>
<input
onChange={onChangeColor}
checked={filters.color === 'white'}
className='btn-check'
type='radio'
name='color'
id='colorRadio4'
value='white'
/>
<MDBRipple
rippleTag='label'
className='btn btn-light btn-rounded p-3 '
htmlFor='colorRadio4'
></MDBRipple>
</div>
<div className='form-check form-check-inline m-0 p-0 pr-3'>
<input
onChange={onChangeColor}
checked={filters.color === 'grey'}
className='btn-check'
type='radio'
name='color'
id='colorRadio6'
value='grey'
/>
<MDBRipple
style={{ backgroundColor: '#bdbdbd' }}
rippleTag='label'
className='btn btn-rounded p-3 '
htmlFor='colorRadio6'
></MDBRipple>
</div>
<div className='form-check form-check-inline m-0 p-0 pr-3'>
<input
onChange={onChangeColor}
checked={filters.color === 'black'}
className='btn-check'
type='radio'
name='color'
id='colorRadio3'
value='black'
/>
<MDBRipple
rippleTag='label'
className='btn bg-dark text-white btn-rounded p-3 '
htmlFor='colorRadio3'
></MDBRipple>
</div>
<div className='form-check form-check-inline m-0 p-0 pr-3'>
<input
onChange={onChangeColor}
checked={filters.color === 'blue'}
className='btn-check'
type='radio'
name='color'
id='colorRadio2'
value='blue'
/>
<MDBRipple
rippleTag='label'
className='btn bg-primary btn-rounded p-3 '
htmlFor='colorRadio2'
></MDBRipple>
</div>
<div style={{ paddingRight: '1rem' }} className='form-check form-check-inline m-0 p-0'>
<input
onChange={onChangeColor}
checked={filters.color === 'red'}
className='btn-check'
type='radio'
name='color'
id='colorRadio1'
value='red'
/>
<MDBRipple
rippleTag='label'
className='btn bg-danger btn-rounded p-3 '
htmlFor='colorRadio1'
></MDBRipple>
</div>
<div className='form-check form-check-inline m-0 p-0 pr-3'>
<input
onChange={onChangeColor}
checked={filters.color === 'orange'}
className='btn-check'
type='radio'
name='color'
id='colorRadio5'
value='orange'
/>
<MDBRipple
rippleTag='label'
className='btn btn-rounded bg-warning p-3 '
htmlFor='colorRadio5'
></MDBRipple>
</div>
</section>
</section>
</MDBCol>
<MDBCol md='8'>
<MDBRow className='justify-content-center'>
<MDBCol md='6' className='my-auto py-3'>
<MDBSelect
getSelectedValue={handleGetValue}
label='Sort'
data={[
{ text: 'Best rating', value: 1, selected: true },
{ text: 'Lowest price first', value: 2 },
{ text: 'Highest price first', value: 3 },
]}
/>
</MDBCol>
</MDBRow>
<MDBFilters
filters={filters}
filterOptions={[
{ type: 'checkbox', key: 'condition' },
{
type: 'custom',
key: 'rating',
custom: (data, key, filter) => {
return filter ? data.filter((item: any) => item.rating === filter) : data;
},
},
{
type: 'custom',
key: 'price',
custom: (data, key, filter) => {
return filter
? data.filter((item: any) => item.price >= filter.min && item.price <= filter.max)
: data;
},
},
{
type: 'custom',
key: 'size',
custom: (data, key, filter) => {
return filter.length
? data.filter((item: any) => item.size.some((size: string) => filter.includes(size)))
: data;
},
},
{
type: 'radio',
key: 'color',
},
]}
filterData={setFilterData}
data={advancedData}
sortOptions={sort}
className='mb-4'
>
{filterData.map((item, i) => (
<MDBCol key={i} md='4' className='col-md-4 my-4 justify-content-center text-center'>
<MDBAnimation key={Math.random()} animation='fade-in' start='onLoad' tag='div'>
<div className='bg-image hover-overlay hover-zoom hover-shadow ripple rounded'>
<img src={item.image} className='img-fluid w-100' style={{ height: '325px' }} />
<a href='#!'>
<div className='mask rounded' style={{ backgroundColor: 'rgba(66, 66, 66, 0.2)' }}></div>
</a>
</div>
<div className='pt-4'>
<h5>{item.name}</h5>
<strong>${item.price}</strong>
</div>
</MDBAnimation>
</MDBCol>
))}
</MDBFilters>
</MDBCol>
</MDBRow>
</MDBContainer>
</main>
<MDBFooter className='bg-dark text-white text-lg-left'>
<div className='bg-primary text-center p-3'>
<MDBRow>
<MDBCol md='6'>
<span className='font-weight-bold'>Get connected with us on social networks!</span>
</MDBCol>
<MDBCol md='6'>
<MDBIcon fab icon='instagram' />
<MDBIcon fab icon='linkedin-in' style={{ marginLeft: '1.5rem' }} />
<MDBIcon fab icon='twitter' style={{ marginLeft: '1.5rem' }} />
<MDBIcon fab icon='facebook-f' style={{ marginLeft: '1.5rem' }} />
</MDBCol>
</MDBRow>
</div>
<div className='container p-5'>
<div className='row p-2'>
<div className='col-md-3 mx-auto py-4'>
<h5 className='text-uppercase'>About me</h5>
<hr className='mb-4 mt-0' />
<p>
Here you can use rows and columns to organize your footer content. Lorem ipsum dolor sit amet,
consectetur adipisicing elit.
</p>
</div>
<div className='col-md-3 mx-auto py-4'>
<h5 className='text-uppercase'>Products</h5>
<hr className='mb-4 mt-0' />
<ul className='list-unstyled mb-0'>
<li className='mb-2'>
<a href='#!' className='text-white'>
MDBootstrap
</a>
</li>
<li className='mb-2'>
<a href='#!' className='text-white'>
MDWordPress
</a>
</li>
<li className='mb-2'>
<a href='#!' className='text-white'>
BrandFlow
</a>
</li>
<li>
<a href='#!' className='text-white'>
Bootstrap Angular
</a>
</li>
</ul>
</div>
<div className='col-md-3 mx-auto py-4'>
<h5 className='text-uppercase'>Useful links</h5>
<hr className='mb-4 mt-0' />
<ul className='list-unstyled'>
<li className='mb-2'>
<a href='#!' className='text-white'>
Your Account
</a>
</li>
<li className='mb-2'>
<a href='#!' className='text-white'>
Become an Affiliate
</a>
</li>
<li className='mb-2'>
<a href='#!' className='text-white'>
Shipping Rates
</a>
</li>
<li>
<a href='#!' className='text-white'>
Help
</a>
</li>
</ul>
</div>
<div className='col-md-3 mx-auto py-4'>
<h5 className='text-uppercase'>Contacts</h5>
<hr className='mb-4 mt-0' />
<ul className='list-unstyled'>
<li className='mb-2'>
<a href='#!' className='text-white'>
<i className='far fa-map mr-1'></i> New York, Avenue Street 10
</a>
</li>
<li className='mb-2'>
<a href='#!' className='text-white'>
<i className='fas fa-phone-alt mr-1'></i> 042 876 836 908
</a>
</li>
<li className='mb-2'>
<a href='#!' className='text-white'>
<i className='far fa-envelope mr-1'></i> company@example.com
</a>
</li>
<li>
<a href='#!' className='text-white'>
<i className='far fa-clock mr-1'></i> Monday - Friday: 10-17
</a>
</li>
</ul>
</div>
</div>
</div>
<div className='text-center p-3' style={{ backgroundColor: 'rgba(0, 0, 0, 0.2)' }}>
© 2020 Copyright:{' '}
<a className='text-white' href='https://mdbootstrap.com/'>
MDBootstrap.com
</a>
</div>
</MDBFooter>
</>
);
}
Filters - API
Import
import { MDBFilters } from 'mdb-react-filters';
Properties
Filters
| Name | Type | Default | Description | Example |
|---|---|---|---|---|
className
|
string | '' |
Adds a custom class to MDBFilters. |
<MDBFilters className="class" />
|
data
|
Array<any> | - |
Array with the original data. |
<MDBFilters data={exampleData} />
|
filterData
|
React.SetStateAction<any> | |
Intented to set the state of the filtered data. |
<MDBFilters filterData={setData} />
|
filterOptions
|
Array<FilterOptionsObject> | |
Defines the filter options. |
<MDBFilters filterOptions={options} />
|
sortOptions
|
SortOptionsObject | - |
Defines the sort options. |
<MDBFilters sortOptions={options} />
|
Advanced types
FilterOptionsObject
type FilterOptionsObject = {
key: string;
type: 'custom' | 'radio' | 'checkbox';
custom?: (data: Array<any>, key: string, filter: number | string | boolean | any) => Array<any>;
};
SortOptionsObject
type SortOptionsObject = {
sortProperty: string;
order: string;
customSort?: (firstItem: string, secondItem: string) => 1 | 0 | -1;
};