2016-07-30 2 views
3

Я последовал код Дэ Абрамов на https://github.com/tayiorbeii/egghead.io_redux_course_notes/blob/master/08-Reducer_Composition_with_Arrays.mdReact-Redux оператора Spread в редукторе возвращение ошибки «неожиданный маркер»

Я получаю сообщение об ошибке «Неожиданный маркер в строке 22» со ссылкой на ... TODO не думаю, что это связано с настройками Babel, поскольку ... состояние работает нормально. Когда я заменяю ... todo with ... state внутри функции map, он возвращает ту же ошибку.

///Reducer// 
    export default (state=[], action) => { 
     switch (action.type) { 

     case 'ADD_TODO': 
      return [...state, 
       { 
       id:action.id, 
       text: action.text, 
       completed:false 
       } 
      ]; 

     case 'TOGGLE_TODO': 
      return state.map(todo => { 
      if (todo.id !== action.id) { 
       return todo; 
      } 

      return { 
       ...todo, //returning error 
       completed: !todo.completed 
      }; 
      }); 


     default: 
      return state; 
     } 
    } 

Мой код вызова:

it('handles TOGGLE_TODO',() => { 
    const initialState = [ 
     { 
     id:0, 
     text: 'Learn Redux', 
     completed: false 
     }, 
     { 
     id:1, 
     text: 'Go Shopping', 
     completed: false 
     } 
    ]; 


    const action = { 
     type: 'TOGGLE_TODO', 
     id: 1 
    } 




    const nextstate = reducer(initialState,action) 



    expect (nextstate).to.eql([ 
     { 
     id:0, 
     text: 'Learn Redux', 
     completed: false 
     }, 
     { 
     id:1, 
     text: 'Go Shopping', 
     completed: true 
     } 
    ]) 
+0

Оператор распространения определяется по-разному для массивов и объектов, поэтому она работает для ... а не ... todos. У вас есть файл .babelrc где угодно? Вам понадобится хотя бы второй этап, чтобы использовать оператор распространения объектов за: https://github.com/sebmarkbage/ecmascript-rest-spread –

+0

У меня не было файла .babelrc. Я создал один, и я установил и добавил плагин «преобразование-объект-отдых-распространение» в файле .babelrc, но затем я вдруг начал получать сообщение об ошибке, что импорт является зарезервированным словом. Итак, я добавил ES2015, предварительно установленный внутри самого .babelrc, и теперь он сработал. Я думал, что у меня уже был ES2015, работающий с тех пор ... состояние работало. Странный... –

ответ

4

Речь идет о предварительных настройках, на самом деле.

Массив распространения является частью стандарта ES2015 и использовать его здесь

 return [...state, 
      { 
      id:action.id, 
      text: action.text, 
      completed:false 
      } 
     ]; 

Однако здесь

 return { 
      ...todo, //returning error 
      completed: !todo.completed 
     }; 

вы используете object spread, который не является частью стандарта, но a stage 2 proposal.

Вам необходимо включить поддержку этого предложения в Вавилоне: https://babeljs.io/docs/plugins/transform-object-rest-spread/ или desugar его в Object.assign вызовов (см this part of the proposal)

Смежные вопросы