简体   繁体   English

将代码拆分成组件应用过滤器,进行排序,添加,编辑,删除数据

[英]React code splitting to components app filters, sorts, adds, edits, removes data

I am new to react. 我是新来的反应。 I started creating a phonebook app which fetches a json file, loads it to the screen. 我开始创建一个电话簿应用程序,该应用程序将获取一个json文件,并将其加载到屏幕上。 You can sort, filter, add, delete, edit data. 您可以对数据进行排序,过滤,添加,删除,编辑。 My problem is that I cannot make my code cleaner and it looks really bad, because I am even repeating code blocks. 我的问题是我无法使代码更整洁,而且看起来真的很糟糕,因为我什至在重复代码块。

import React from 'react';

const filteredAndSorted = ({contacts, search, sortIt, sortBy, direction, deleteContact}) => {
    if (direction === 'notsorted') {
    const filteredData = contacts.filter(
    contacts => {
    return contacts.name.toLowerCase().includes(search.toLowerCase()) ||
    contacts.address.toLowerCase().includes(search.toLowerCase()) ||
    contacts.phone_number.includes(search);
    })
        return (
    <div>
    {filteredData.map((contacts) => 
        <ul className="gradient_text" key={contacts.name}>
        <li>Name: {contacts.name}</li>
        <li>Phone: {contacts.phone_number}</li>
        <li>Address: {contacts.address}</li>
        <li>Id: {contacts.name}</li>
        <button onClick={() => deleteContact(contacts.name)}>delete</button>
        <hr />
        </ul>
        )}    

       </div>

        );
    }
    else if(direction === 'Ascending') {
        let filteredAndSortedData = 
    contacts
    .sort((a, b) => { if(a.name < b.name) { return -1; } if(a.name > b.name) { return 1; } return 0; })
    .filter(
    contacts => {
    return contacts.name.toLowerCase().includes(search.toLowerCase()) ||
    contacts.address.toLowerCase().includes(search.toLowerCase()) ||
    contacts.phone_number.includes(search);
    })
        return (
    <div>
    {filteredAndSortedData.map((contacts) => 
        <ul className="gradient_text" key={contacts.name}>
        <li>Name: {contacts.name}</li>
        <li>Phone: {contacts.phone_number}</li>
        <li>Address: {contacts.address}</li>
        <li>Id: {contacts.name}</li>
        <button onClick={() => deleteContact(contacts.name)}>delete</button>
        <hr />
        </ul>
        )}    

       </div>

        );
    }
    else if(direction === 'Descending') {
        let filteredAndSortedData = 
    contacts
    .sort((a, b) => { if(a.name > b.name) { return -1; } if(a.name < b.name) { return 1; } return 0; })
    .filter(
    contacts => {
    return contacts.name.toLowerCase().includes(search.toLowerCase()) ||
    contacts.address.toLowerCase().includes(search.toLowerCase()) ||
    contacts.phone_number.includes(search);
    })
        return (
    <div>
    {filteredAndSortedData.map((contacts) => 
        <ul className="gradient_text" key={contacts.name}>
        <li>Name: {contacts.name}</li>
        <li>Phone: {contacts.phone_number}</li>
        <li>Address: {contacts.address}</li>
        <li>Id: {contacts.name}</li>
        <button onClick={() => deleteContact(contacts.name)}>delete</button>
        <hr />
        </ul>
        )}    

       </div>

        );
    }

}

export default filteredAndSorted;

I would like to split this file into smaller components, but I am getting confused with accessing filteredAndSorted and mapping through it. 我想将此文件拆分为较小的组件,但我对访问filteredAndSorted并通过它进行映射感到困惑。 Any advice is really appreciated. 任何建议都非常感谢。

Quicker suggestion: define a simple function on the top, something like this: 更快的建议:在顶部定义一个简单的函数,如下所示:

const contactDetail = (contacts) => 
    <ul className="gradient_text" key={contacts.name}>
    <li>Name: {contacts.name}</li>
    <li>Phone: {contacts.phone_number}</li>
    <li>Address: {contacts.address}</li>
    <li>Id: {contacts.name}</li>
    <button onClick={() => deleteContact(contacts.name)}>delete</button>
    <hr />
    </ul>
    )

From here you can replace .map calls with simpler forms: 在这里,您可以用更简单的形式替换.map调用:

filteredAndSortedData.map(contactDetail)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM