首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单击时,我的react-dates不工作/呈现

单击时,我的react-dates不工作/呈现
EN

Stack Overflow用户
提问于 2019-06-15 06:18:28
回答 2查看 938关注 0票数 0

我正在构建一个react redux费用跟踪应用程序,并使用moment.js和react-dates来设置时间和过滤时间范围。然而,当我选择anywhere,或者选择"x“清除日期时,我会得到错误,那么屏幕上就什么都没有了。

代码语言:javascript
复制
expenses.js:9 Uncaught TypeError: Cannot read property 'toLowerCase' of undefined
    at expenses.js:9
    at Array.filter (<anonymous>)
    at expenses.js:5
    at Function.mapStateToProps [as mapToProps] (ExpenseList.js:17)
    at mapToPropsProxy (wrapMapToProps.js:41)
    at handleNewState (selectorFactory.js:44)
    at handleSubsequentCalls (selectorFactory.js:58)
    at pureFinalPropsSelector (selectorFactory.js:63)
    at Subscription.checkForUpdates [as onStateChange] (connectAdvanced.js:247)
    at Subscription.handleChangeWrapper (Subscription.js:70)

我已经仔细检查过了,还是找不到问题所在。

减速器/过滤器:

代码语言:javascript
复制
const filterReducerDefaultState = {
    text: '',
    sortBy: 'date',
    startDate: moment().startOf('month'),
    endDate: moment().endOf('month')
}

下面是selectors/expenses.js:

代码语言:javascript
复制
import moment from 'moment'

//Get visible expenses
export default (expenses, { text, sortBy, startDate, endDate }) => {
    return expenses.filter((expense) => {
        const createdAtMoment = moment(expense.createdAt)
        const startDateMatch = startDate ? startDate.isSameOrBefore(createdAtMoment, 'day') : true
        const endDateMatch = endDate? endDate.isSameOrAfter(createdAtMoment, 'day'): true
        const textMatch = expense.description.toLowerCase().includes(text.toLowerCase())

        return startDateMatch && endDateMatch && textMatch
    }).sort((a, b) => {
        if (sortBy === 'date') {
            return a.createdAt < b.createdAt ? 1 : -1
        } else if (sortBy === 'amount') {
            return a.amount < b.amount ?  1 : -1
        }
    })
}

以下是components/ExpenseListFilters.js:

代码语言:javascript
复制
import React from 'react'
import { connect } from 'react-redux'
import { DateRangePicker } from 'react-dates'
import { setTextFilter, sortByAmount, sortByDate, setStartDate, setEndDate } from '../actions/filters'

class ExpenseListFilters extends React.Component{
    state={
        calendarFocused: null
    }
    onDatesChange = ({startDate, endDate}) => {
        this.props.dispatch(setStartDate(startDate))
        this.props.dispatch(setEndDate(endDate))
    }
    onFocusChange = (calendarFocused) => {
        this.setState(() => ({ calendarFocused}))
    }
    render(){
        return (
            <div>
        <input 
        type="text" 
        value={this.props.filters.text} 
        onChange={(e) => {
            this.props.dispatch(setTextFilter(e.target.value))
        }} />
        <select 
        value ={this.props.filters.sortBy}
        onChange={(e)=> {
            if (e.target.value === 'date'){
                this.props.dispatch(sortByDate())
            } else if (e.target.value === 'amount') {
                this.props.dispatch(sortByAmount())
            }
        }}>
            <option value="date">Date</option>
            <option value="amount">Amount</option>
        </select>
        <DateRangePicker 
        startDate={this.props.filters.startDate}
        startDateId='startDateId'
        endDate={this.props.filters.endDate}
        endDateId='endDateId'
        onDatesChange={this.onDatesChange}
        focusedInput={this.state.calendarFocused}
        onFocusChange={this.onFocusChange}
        showClearDates={true}
        numberOfMonths={1}
        isOutsideRange={()=> false}
        />
    </div>
        )
    }
}

const mapStateToProps = (state) => {
    return {
        filters: state.filters
    }
}
export default connect(mapStateToProps)(ExpenseListFilters)

我希望能够通过单击日历上的"X“清除日期,这样我的演示数据就可以显示出来,或者选择某个范围进行过滤。我怎么才能修复它呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-15 16:00:31

嗨,我现在解决了我的问题:我忘了在我的reducers/filters中包含...state:

代码语言:javascript
复制
        case 'SET_START_DATE':
            return {
                startDate: action.startDate
            }
        case 'SET_END_DATE':
            return {
                endDate: action.endDate
            }

它应该是:

代码语言:javascript
复制
        case 'SET_START_DATE':
            return {
                ...state,
                startDate: action.startDate
            }
        case 'SET_END_DATE':
            return {
                ...state,
                endDate: action.endDate
            }
票数 0
EN

Stack Overflow用户

发布于 2019-06-15 08:24:56

因为错误显示为Cannot read property 'toLowerCase' of undefined,所以问题出在代码const textMatch = expense.description.toLowerCase().includes(text.toLowerCase())

为了防止出现这样的问题,我喜欢包含一个默认值,它可能如下所示

代码语言:javascript
复制
export default (expenses, { text = '', sortBy, startDate, endDate }) => {
    return expenses.filter((expense = {}) => {
        const { description = '' } = expense
        const createdAtMoment = moment(expense.createdAt)
        const startDateMatch = startDate ? startDate.isSameOrBefore(createdAtMoment, 'day') : true
        const endDateMatch = endDate? endDate.isSameOrAfter(createdAtMoment, 'day'): true
        const textMatch = expense.description.toLowerCase().includes(text.toLowerCase())

        return startDateMatch && endDateMatch && textMatch
    }).sort((a, b) => {

通过为文本、费用和描述添加一个默认值,您的代码不会出错--但问题很可能得不到解决。

为了解决这个问题,我建议将控制台日志添加到每一行,以确保值与您期望的值匹配-或者使用nodejs的内置debugger工具

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56605744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档