面试题答案
一键面试1. 从store中获取数据并使用Map渲染列表
- 安装依赖:
确保项目中安装了
react
、react - dom
、redux
和react - redux
。
npm install react react - dom redux react - redux
- 设置Redux store:
创建
reducer
来管理待办事项列表数据。假设待办事项数据结构为{ id: number, text: string, completed: boolean }
。
// reducer.js
const initialState = [];
const todoReducer = (state = initialState, action) => {
switch (action.type) {
// 可添加其他action处理逻辑
default:
return state;
}
};
export default todoReducer;
创建store
。
// store.js
import { createStore } from'redux';
import todoReducer from './reducer';
const store = createStore(todoReducer);
export default store;
- 在React组件中使用数据:
使用
react - redux
的connect
(或useSelector
和useDispatch
钩子,这里以connect
为例)从store
获取数据并渲染列表。
// TodoList.js
import React from'react';
import { connect } from'react - redux';
const TodoList = ({ todos }) => {
return (
<ul>
{todos.map(todo => (
<li key={todo.id}>{todo.text}</li>
))}
</ul>
);
};
const mapStateToProps = state => ({
todos: state
});
export default connect(mapStateToProps)(TodoList);
- 在应用中使用
TodoList
组件:
// App.js
import React from'react';
import ReactDOM from'react - dom';
import TodoList from './TodoList';
import { Provider } from'react - redux';
import store from './store';
const App = () => {
return (
<Provider store={store}>
<TodoList />
</Provider>
);
};
ReactDOM.render(<App />, document.getElementById('root'));
2. 更新列表并保证Map渲染的列表能正确反映变化
- 添加action和reducer逻辑:
在
reducer
中添加处理勾选待办事项的逻辑。
// reducer.js
const initialState = [];
const todoReducer = (state = initialState, action) => {
switch (action.type) {
case 'TOGGLE_TODO':
return state.map(todo =>
todo.id === action.payload.id
? {...todo, completed:!todo.completed }
: todo
);
default:
return state;
}
};
export default todoReducer;
在action
文件中定义toggleTodo
action。
// actions.js
const toggleTodo = id => ({
type: 'TOGGLE_TODO',
payload: { id }
});
export { toggleTodo };
- 在组件中触发action:
使用
connect
(或useDispatch
钩子)在组件中触发toggleTodo
action。
// TodoList.js
import React from'react';
import { connect } from'react - redux';
import { toggleTodo } from './actions';
const TodoList = ({ todos, toggleTodo }) => {
return (
<ul>
{todos.map(todo => (
<li key={todo.id}>
<input
type="checkbox"
checked={todo.completed}
onChange={() => toggleTodo(todo.id)}
/>
{todo.text}
</li>
))}
</ul>
);
};
const mapStateToProps = state => ({
todos: state
});
const mapDispatchToProps = dispatch => ({
toggleTodo: id => dispatch(toggleTodo(id))
});
export default connect(mapStateToProps, mapDispatchToProps)(TodoList);
如果使用其他状态管理库,如MobX:
- 安装MobX和mobx - react:
npm install mobx mobx - react
- 创建MobX store:
// store.js
import { makeObservable, observable, action } from'mobx';
class TodoStore {
todos = [];
constructor() {
makeObservable(this, {
todos: observable,
toggleTodo: action
});
}
toggleTodo(id) {
this.todos = this.todos.map(todo =>
todo.id === id
? {...todo, completed:!todo.completed }
: todo
);
}
}
const todoStore = new TodoStore();
export default todoStore;
- 在React组件中使用MobX store:
// TodoList.js
import React from'react';
import { observer } from'mobx - react';
import todoStore from './store';
const TodoList = observer(() => {
return (
<ul>
{todoStore.todos.map(todo => (
<li key={todo.id}>
<input
type="checkbox"
checked={todo.completed}
onChange={() => todoStore.toggleTodo(todo.id)}
/>
{todo.text}
</li>
))}
</ul>
);
});
export default TodoList;
- 在应用中使用
TodoList
组件:
// App.js
import React from'react';
import ReactDOM from'react - dom';
import TodoList from './TodoList';
const App = () => {
return <TodoList />;
};
ReactDOM.render(<App />, document.getElementById('root'));