如何避免代码中的 Array-callback-return 错误

How can I avoid Array-callback-return error in my code

我想过滤项目列表并根据我的过滤条件显示项目。

我的物品清单

const [persons, setPersons] = useState([
        { name: 'Arton Senna', tel: '9900000000' },
        { name: 'Ada Lovelace', tel: '39-44-5323523' },
        { name: 'Dan Abramov', tel: '12-43-234345' },
        { name: 'Mary Poppendieck', tel: '39-23-6423122' }
    ])

我有一个输入元素,它是一个搜索字段

    <div>
        <label htmlFor='filter'>Filter phonebook with</label>
        <input type='text' name='filter_contacts' id='filter' onChange={filterText} />
    </div>

搜索字段有一个 onchange 处理程序

const filterText = (event) => {
        return setFilter(event.target.value)
    }

我正在使用 .map 辅助方法呈现列表项

    <ul>
       {persons.map(person => <li key={person.tel}>{person.name} {person.tel}</li>)}
    </ul>

我的状态对象如下

// persons
const [persons, setPersons] = useState([
        { name: 'Arton Senna', tel: '9900000000' },
        { name: 'Ada Lovelace', tel: '39-44-5323523' },
        { name: 'Dan Abramov', tel: '12-43-234345' },
        { name: 'Mary Poppendieck', tel: '39-23-6423122' }
    ])
// serachField
    const [filter, setFilter] = useState('')

我希望能够根据我在 <input/> 搜索元素中键入的内容来呈现我的列表,因此我执行了以下操作

     <ul>
       {persons
           .filter(person => {
               if (filter === '') {
                  return person
               } else if (person.name.toLocaleLowerCase().includes(filter.toLowerCase())) {
                  return person
               }})
            .map(person => <li key={person.tel}>{person.name} {person.tel}</li>)}
     </ul>

执行此操作后,eslint 给我以下警告消息
Array.prototype.filter() expects a value to be returned at the end of arrow function.eslintarray-callback-return


**请帮助我理解这个问题,我该如何......**

@Quentin 我做了以下重构

                    {
                        filter
                            // truthy 
                            ? persons.filter(person => person.name.toLowerCase().includes(filter.toLowerCase())).map(person => <li key={person.tel}>{person.name} {person.tel}</li>)
                            // falsy 
                            : persons.map(person => <li key={person.tel}>{person.name} {person.tel}</li>)
                    }

What is the problem with the way I'm doing it?

ESLint 希望您明确地 return 某事:总是。

如果代码到达函数的末尾,它会隐式 returns undefined。 ESlint 希望你是明确的。

person => {
  if (filter === '') {
    return person
  } else if (person.name.toLocaleLowerCase().includes(filter.toLowerCase())) {
    return person
  }
  return false; // Explicit
}

What is a succinct way to do the same task

person => (filter === '' || person.name.toLocaleLowerCase().includes(filter.toLowerCase()).toLowerCase()) 

…应该可以解决问题。