Ошибка типа: v. setActiveFile не является функцией

#javascript #reactjs

#язык JavaScript #реагирует на

Вопрос:

Я создаю свой проект в ReactJS. В этом проекте есть страница, на которой я должен создать текстовую область. Эта страница разделена на две части: боковую панель, где вы видите все файлы текущего рабочего пространства, и редактор, область текста html. Когда я нажимаю кнопку, я хотел бы, чтобы текущий файл изменился. Итак, я создал контекст для передачи дочернему элементу. Вот код родительского компонента, мы можем его назвать:

 import '../styles/style.css'; import Editor from './Editor' import Sidebar from './Sidebar' import React, {useState} from 'react';  const WContext = React.createContext();  const EditPage = () =gt; {  const {activeFile, setActiveFile} = useState('Empty');    return lt;gt;  lt;WContext.Provider value={{activeFile, setActiveFile}}gt;  lt;h1 className="edittitle"gt;Edit Pagelt;/h1gt;  lt;div className="edit"gt;  lt;Sidebar /gt;  lt;Editor /gt;  lt;/divgt;  lt;/WContext.Providergt;  lt;/gt; }  export default EditPage; export {WContext};  

Затем есть код боковой панели:

 import {useEffect, useState, useContext} from 'react'; import {WContext} from './EditPage'; import axios from 'axios';  const Sidebar = () =gt; {  const v = useContext(WContext);  const [file, setFile] = useState([]);   useEffect(() =gt; {  //request to server  }, [])   return lt;gt;  lt;div className="sidebar"gt;  lt;h3gt;Files of workspacelt;/h3gt;  lt;div className="sidesaparator"gt;lt;/divgt;  {  file.map(f=gt;{  return lt;button key={f._id} onClick={() =gt; v.setActiveFile(f)} style={{'padding':"10px"}}gt;  {f.name   "."   f.extension}lt;/buttongt;  })  }  lt;/divgt;  lt;/gt; }  export default Sidebar;  

Наконец, код редактора:

 import sun from '../images/sun.png'; import moon from '../images/moon.png'; import {useState, useContext} from 'react'; import {WContext} from './EditPage';  const Editor = () =gt; {  const v = useContext(WContext);  const [text, setText] = useState('//Your code');   const handleChanges = (e) =gt; {  setText(e.target.value);   setLine(countLine);   }   return lt;gt;  lt;form className="editor"gt;  lt;div className="opened"gt; {v.activeFile} lt;/divgt;    lt;textarea name="code" value={text} className="editorText" onChange={handleChanges} spellCheck="false"   id = {bg}gt;lt;/textareagt;    lt;/formgt;  lt;/gt; }  export default Editor;  

В этом последнем файле div с именем класса «открыто» должен содержать текстовое значение activeFile, но это пустая строка. С другой стороны, в файле previus, когда я нажимаю на один файл, он должен стать активным, но в заголовке вопроса появляется ошибка. Я хотел бы знать, где я ошибаюсь и как это исправить. Огромное спасибо

Комментарии:

1. ваш контекст не будет экспортирован до тех пор, пока на вашей странице не будет установлен экспорт по умолчанию.

2. Дело в том, что это не главная страница, поэтому мне нужно экспортировать обе

3. затем используйте экспорт {WContext,страница редактирования}

4. Нет, это не сработало

5. использовали ли вы поставщика контекста для упаковки связанных компонентов? я могу это видеть

Ответ №1:

Все это можно исправить, переключившись с скобок на квадратные скобки в объявлении useState