国外网站风格,wordpress微信机器人,哪个公司的软件开发公司,长春做公司网站的基础知识 1. 什么是 React#xff1f;它的主要特点是什么#xff1f;
React 是一个用于构建用户界面的 JavaScript 库#xff0c;由 Facebook 开发并维护。它主要用于构建单页应用程序#xff08;SPA#xff09;和复杂的用户界面。React 的主要特点包括#xff1a;
组件…基础知识 1. 什么是 React它的主要特点是什么
React 是一个用于构建用户界面的 JavaScript 库由 Facebook 开发并维护。它主要用于构建单页应用程序SPA和复杂的用户界面。React 的主要特点包括
组件化React 将 UI 分解成独立的、可重用的组件。每个组件都有自己的逻辑和控制。虚拟 DOMReact 使用虚拟 DOM 来提高性能。虚拟 DOM 是一个内存中的树结构React 会先在虚拟 DOM 中进行操作然后批量更新真实 DOM。声明式编程React 采用声明式编程风格开发者只需描述 UI 应该是什么样的React 会负责处理 UI 的变化。JSXReact 使用 JSXJavaScript XML语法允许在 JavaScript 中编写类似 HTML 的标记。生态系统丰富React 拥有丰富的生态系统包括路由器React Router、状态管理库Redux、MobX等。
2. 什么是 JSX它有什么优点
JSX 是一种语法扩展允许在 JavaScript 中编写类似 HTML 的标记。JSX 最终会被编译成普通的 JavaScript 代码。
优点
可读性强JSX 使得模板代码更加直观和易读特别是对于复杂的 UI 结构。类型检查JSX 可以在编译时进行类型检查减少运行时错误。表达式支持可以在 JSX 中嵌入 JavaScript 表达式使得动态生成 UI 变得更加方便。工具支持现代开发工具如 Babel可以将 JSX 编译成兼容所有浏览器的 JavaScript 代码。
3. 什么是虚拟 DOM它是如何工作的
虚拟 DOM 是一个轻量级的内存中的 DOM 树表示。React 使用虚拟 DOM 来提高性能避免频繁的操作真实 DOM。
工作原理
创建虚拟 DOMReact 在内存中创建一个虚拟 DOM 树。Diff 算法当状态改变时React 会比较新的虚拟 DOM 和旧的虚拟 DOM找出差异即最小的变更集合。批量更新React 将这些差异批量应用到真实 DOM减少 DOM 操作次数提高性能。
4. React 中的单向数据流是什么意思
单向数据流 是 React 的核心设计理念之一。在单向数据流中数据只能从父组件流向子组件不能反向流动。这种方式使得数据流更加清晰和可控。
特点
数据一致性单向数据流确保了数据的一致性避免了数据的混乱和不可预测的变化。易于调试数据流的单一方向使得调试更加容易可以更容易地追踪数据的变化。可预测性单向数据流使得应用的状态变化更加可预测便于维护和扩展。
5. 什么是 Props 和 State它们的区别是什么
Props属性
定义Props 是组件之间传递数据的一种方式。父组件可以通过 props 向子组件传递数据。不可变Props 是只读的子组件不能修改传入的 props。用途用于配置组件的行为和外观。
State状态
定义State 是组件内部的状态用于存储组件的数据。可变State 是可变的可以通过 setState 方法更新。用途用于管理组件的内部状态控制组件的行为和渲染。
区别
来源Props 来自父组件State 是组件自身的状态。可变性Props 是只读的State 是可变的。用途Props 用于配置组件State 用于管理组件的内部状态。
6. 如何在 React 中创建一个组件
函数组件
const MyComponent (props) {return divHello, {props.name}!/div;
};类组件
class MyComponent extends React.Component {render() {return divHello, {this.props.name}!/div;}
}7. 什么是函数组件和类组件它们有什么区别
函数组件
定义函数组件是一个简单的 JavaScript 函数接收 props 作为参数返回 JSX。优点代码更简洁性能更好因为没有类的开销。限制早期版本的函数组件不支持生命周期方法和状态管理但随着 Hooks 的引入这些限制已经被解除。
类组件
定义类组件是继承自 React.Component 的 ES6 类可以定义生命周期方法和管理状态。优点支持生命周期方法和状态管理功能更强大。缺点代码相对复杂性能略逊于函数组件。
8. 什么是纯组件为什么要使用纯组件
纯组件 定义纯组件是一种特殊的组件它通过 React.memo函数组件或 PureComponent类组件来实现。纯组件会在 props 或 state 发生变化时进行浅比较如果前后值相同则跳过重新渲染。 优点 性能优化减少不必要的重新渲染提高应用性能。简化逻辑开发者不需要手动实现 shouldComponentUpdate 方法来优化性能。
使用场景
静态数据组件的 props 和 state 不经常变化。复杂组件组件内部逻辑复杂重新渲染开销大。
9. 什么是 React Context API它解决了什么问题
React Context API 定义Context API 是 React 提供的一种在组件树中传递数据的机制无需通过 props 逐层传递。 使用 创建 Context使用 React.createContext 创建一个 Context 对象。提供 Context使用 Context.Provider 组件将数据传递给子组件。消费 Context使用 Context.Consumer 组件或 useContext Hook 在子组件中访问数据。 组件
1. 什么是受控组件和非受控组件它们的区别是什么
受控组件Controlled Components 定义受控组件是指那些其输入值由 React 的状态state控制的表单组件。每次用户输入时都会触发一个事件处理器更新组件的状态从而更新表单的值。 特点 状态管理表单的值由 React 状态管理。事件处理每次用户输入时都会触发事件处理器。 示例 import React, { useState } from react;const ControlledForm () {const [value, setValue] useState();const handleChange (e) {setValue(e.target.value);};const handleSubmit (e) {e.preventDefault();console.log(Form submitted with value:, value);};return (form onSubmit{handleSubmit}input typetext value{value} onChange{handleChange} /button typesubmitSubmit/button/form);
};export default ControlledForm;非受控组件Uncontrolled Components 定义非受控组件是指那些其输入值不由 React 状态管理的表单组件。相反它们依赖于 DOM API 来获取表单的值。 特点 DOM API通过 ref 获取表单的值。初始值可以通过 defaultValue 或 defaultChecked 属性设置初始值。 示例 import React, { useRef } from react;const UncontrolledForm () {const inputRef useRef(null);const handleSubmit (e) {e.preventDefault();console.log(Form submitted with value:, inputRef.current.value);};return (form onSubmit{handleSubmit}input typetext ref{inputRef} /button typesubmitSubmit/button/form);
};export default UncontrolledForm;2. 如何在 React 中实现条件渲染
条件渲染 是指根据条件决定是否渲染某个组件或元素。React 提供了多种方式来实现条件渲染 三元运算符 const App ({ isLoggedIn }) {return (div{isLoggedIn ? h1Welcome back!/h1 : h1Please log in./h1}/div);
};逻辑与运算符 const App ({ user }) {return (div{user h1Welcome, {user.name}!/h1}/div);
};使用 if 语句 const App ({ items }) {if (items.length 0) {return h1No items found./h1;}return (ul{items.map(item (li key{item.id}{item.name}/li))}/ul);
};3. 什么是高阶组件HOC请给出一个实际的例子。
高阶组件Higher-Order Component, HOC 是一个函数它接受一个组件并返回一个新的组件。HOC 用于复用组件逻辑增强组件的功能。
示例 假设我们有一个 withLogging HOC用于在组件渲染时记录日志。
import React from react;// 高阶组件
const withLogging (WrappedComponent) {return class extends React.Component {componentDidMount() {console.log(Component ${WrappedComponent.name} mounted);}componentWillUnmount() {console.log(Component ${WrappedComponent.name} will unmount);}render() {return WrappedComponent {...this.props} /;}};
};// 被包裹的组件
const MyComponent (props) {return h1Hello, {props.name}!/h1;
};// 使用 HOC
const MyComponentWithLogging withLogging(MyComponent);export default MyComponentWithLogging;4. 什么是 Render Props它有什么优点
Render Props 是一种在 React 中共享代码的技术通过在组件中传递一个函数作为 prop 来实现。这个函数负责返回 JSX从而实现在不同组件间共享逻辑。
优点
复用逻辑可以在多个组件中复用相同的逻辑。灵活性可以自由地决定如何渲染组件而不受限于预定义的结构。
示例 假设我们有一个 MouseTracker 组件用于跟踪鼠标位置。
import React from react;// 跟踪鼠标位置的组件
class MouseTracker extends React.Component {constructor(props) {super(props);this.state { x: 0, y: 0 };}handleMouseMove (event) {this.setState({x: event.clientX,y: event.clientY});};render() {return (div style{{ height: 100vh }} onMouseMove{this.handleMouseMove}{this.props.render(this.state)}/div);}
}// 使用 Render Props 的组件
const App () {return (MouseTracker render{({ x, y }) (h1The mouse position is ({x}, {y})/h1)} /);
};export default App;5. 如何在 React 中实现列表渲染
列表渲染 是指根据数组数据动态生成多个组件或元素。React 提供了 map 方法来实现这一功能。
示例 假设我们有一个 items 数组需要渲染成一个列表。
import React from react;const App ({ items }) {return (ul{items.map((item) (li key{item.id}{item.name}/li))}/ul);
};const items [{ id: 1, name: Apple },{ id: 2, name: Banana },{ id: 3, name: Cherry }
];export default () App items{items} /;6. 什么是 Fragment它的作用是什么
Fragment 是 React 提供的一个特殊组件用于包裹多个子元素而不会在 DOM 中添加额外的节点。这在需要返回多个根节点时非常有用。
作用
避免额外的 DOM 节点在需要返回多个根节点时使用 Fragment 可以避免添加不必要的 DOM 节点。保持代码整洁可以使 JSX 代码更加简洁和易读。
示例
import React from react;const App () {return (React.Fragmenth1Title/h1pParagraph 1/ppParagraph 2/p/React.Fragment);
};// 简写形式
const App () {return (h1Title/h1pParagraph 1/ppParagraph 2/p/);
};export default App;7. 如何在 React 中实现事件处理
事件处理 是指在 React 中处理用户的交互操作如点击、输入等。React 使用合成事件系统来处理事件。
示例
import React, { useState } from react;const App () {const [count, setCount] useState(0);const increment () {setCount(count 1);};const decrement () {setCount(count - 1);};return (divh1Count: {count}/h1button onClick{increment}Increment/buttonbutton onClick{decrement}Decrement/button/div);
};export default App;8. 什么是 Refs如何使用 Refs
Refs 是 React 提供的一种访问 DOM 节点或在类组件中访问实例的方法。Refs 可以用于获取输入值、管理焦点、触发动画等。
使用方法
创建 Ref使用 useRef Hook 或 React.createRef。附加 Ref将 Ref 附加到需要访问的 DOM 节点或组件实例。访问 Ref通过 ref.current 访问 DOM 节点或组件实例。
示例
import React, { useRef } from react;const App () {const inputRef useRef(null);const focusInput () {inputRef.current.focus();};return (divinput typetext ref{inputRef} /button onClick{focusInput}Focus Input/button/div);
};export default App;状态管理
1. 什么是 Redux它的主要特点是什么
Redux 是一个用于管理应用状态的 JavaScript 库通常与 React 一起使用。它提供了一种集中管理应用状态的方式使得状态管理更加可预测和可维护。
主要特点
单一数据源整个应用的状态存储在一个单一的 store 中确保了状态的一致性。状态不可变状态是不可变的每次状态变化时都会生成一个新的状态对象。纯函数通过纯函数reducer来处理状态变化使得状态变化可预测。中间件支持支持中间件可以扩展 Redux 的功能如异步操作、日志记录等。开发者工具提供了强大的开发者工具可以调试、回溯和重放状态变化。
2. 什么是 Redux Thunk它解决了什么问题
Redux Thunk 是一个中间件允许你在 action 创建函数中返回一个函数而不是一个 action 对象。这个返回的函数可以包含异步逻辑并在适当的时候 dispatch 一个或多个 action。
解决问题
异步操作Redux Thunk 允许你处理异步操作如 AJAX 请求而不需要在 reducer 中处理异步逻辑。复杂逻辑可以处理复杂的业务逻辑如条件 dispatch、多次 dispatch 等。
示例
import { createStore, applyMiddleware } from redux;
import thunk from redux-thunk;const initialState { data: null };const reducer (state initialState, action) {switch (action.type) {case FETCH_DATA_SUCCESS:return { ...state, data: action.payload };default:return state;}
};const fetchData () async (dispatch) {const response await fetch(/api/data);const data await response.json();dispatch({ type: FETCH_DATA_SUCCESS, payload: data });
};const store createStore(reducer, applyMiddleware(thunk));store.dispatch(fetchData());3. 什么是 Redux Saga它与 Redux Thunk 有什么区别
Redux Saga 是一个用于管理应用副作用如异步操作的库使用 Generator 函数来处理异步逻辑。
区别
Generator 函数Redux Saga 使用 Generator 函数提供了更强大的控制流和错误处理机制。可测试性Redux Saga 的副作用可以更容易地进行单元测试。复杂逻辑Redux Saga 更适合处理复杂的异步逻辑和并发操作。
示例
import { takeLatest, call, put } from redux-saga/effects;
import { fetchDataSuccess, fetchDataFailure } from ./actions;function* fetchDataSaga() {try {const response yield call(fetch, /api/data);const data yield response.json();yield put(fetchDataSuccess(data));} catch (error) {yield put(fetchDataFailure(error));}
}function* watchFetchData() {yield takeLatest(FETCH_DATA_REQUEST, fetchDataSaga);
}export default function* rootSaga() {yield watchFetchData();
}4. 什么是 MobX它与 Redux 有什么区别
MobX 是一个简单的状态管理库使用观察者模式来管理应用状态。它允许你直接操作状态而不需要通过纯函数和 action。
区别
直接操作状态MobX 允许你直接修改状态而不需要通过 action 和 reducer。自动反应MobX 使用装饰器和 observable 来自动跟踪状态变化并更新相关的视图。简单易用MobX 的 API 更加简单学习曲线更低。
示例
import { makeAutoObservable } from mobx;
import { observer } from mobx-react;class Store {data null;constructor() {makeAutoObservable(this);}fetchData async () {const response await fetch(/api/data);const data await response.json();this.data data;};
}const store new Store();const App observer(() {return (divbutton onClick{() store.fetchData()}Fetch Data/button{store.data pre{JSON.stringify(store.data, null, 2)}/pre}/div);
});5. 如何在 React 中使用 Redux
步骤 安装 Redux 和 React-Redux npm install redux react-redux创建 Reducer const initialState { count: 0 };const counterReducer (state initialState, action) {switch (action.type) {case INCREMENT:return { ...state, count: state.count 1 };case DECREMENT:return { ...state, count: state.count - 1 };default:return state;}
};创建 Store import { createStore } from redux;
import counterReducer from ./counterReducer;const store createStore(counterReducer);提供 Store import React from react;
import ReactDOM from react-dom;
import { Provider } from react-redux;
import store from ./store;
import App from ./App;ReactDOM.render(Provider store{store}App //Provider,document.getElementById(root)
);连接组件 import React from react;
import { useSelector, useDispatch } from react-redux;const Counter () {const count useSelector(state state.count);const dispatch useDispatch();const increment () dispatch({ type: INCREMENT });const decrement () dispatch({ type: DECREMENT });return (divh1Count: {count}/h1button onClick{increment}Increment/buttonbutton onClick{decrement}Decrement/button/div);
};export default Counter;6. 什么是 Context API它与 Redux 有什么区别
Context API 是 React 提供的一种在组件树中传递数据的机制无需通过 props 逐层传递。
区别
简单性Context API 更简单适合小型应用或局部状态管理。性能Context API 在状态变化时会重新渲染所有订阅的组件可能会影响性能。功能Redux 功能更强大适合大型应用和全局状态管理提供了更多的工具和中间件支持。
示例
import React, { createContext, useContext, useState } from react;// 创建 Context
const ThemeContext createContext();// 提供 Context
const ThemeProvider ({ children }) {const [theme, setTheme] useState(light);const toggleTheme () {setTheme(prevTheme prevTheme light ? dark : light);};return (ThemeContext.Provider value{{ theme, toggleTheme }}{children}/ThemeContext.Provider);
};// 使用 Context
const App () {return (ThemeProviderHeader /Content //ThemeProvider);
};const Header () {const { theme, toggleTheme } useContext(ThemeContext);return (header style{{ background: theme light ? #fff : #333, color: theme light ? #000 : #fff }}button onClick{toggleTheme}Toggle Theme/button/header);
};const Content () {const { theme } useContext(ThemeContext);return (div style{{ background: theme light ? #fff : #333, color: theme light ? #000 : #fff }}h1Welcome to the App/h1/div);
};7. 什么是 React Query它解决了什么问题
React Query 是一个用于管理和缓存数据的库特别适合处理 API 请求和数据同步。
解决问题
数据缓存自动缓存 API 响应减少不必要的网络请求。数据同步自动处理数据的加载、更新和错误处理。简化代码提供简单的 API减少数据管理的样板代码。性能优化通过缓存和优化请求提高应用性能。
示例
import React from react;
import { useQuery } from react-query;
import axios from axios;const fetchUser async (id) {const response await axios.get(https://api.example.com/users/${id});return response.data;
};const User ({ userId }) {const { data, error, isLoading } useQuery([user, userId], () fetchUser(userId));if (isLoading) return divLoading.../div;if (error) return divError: {error.message}/div;return (divh1User: {data.name}/h1pEmail: {data.email}/p/div);
};export default User;生命周期
1. 请列出 React 组件的生命周期方法并简要说明每个方法的作用。
React 组件的生命周期可以分为三个阶段挂载Mounting、更新Updating和卸载Unmounting。以下是各个生命周期方法及其作用
挂载阶段Mounting constructor(props) 作用初始化组件的 state 和绑定事件处理器。调用时机组件实例被创建时。 static getDerivedStateFromProps(props, state) 作用在组件实例被创建和更新时调用用于根据 props 更新 state。调用时机组件实例被创建和每次更新之前。 render() 作用返回组件的 JSX描述 UI 的结构。调用时机组件实例被创建和每次更新时。 componentDidMount() 作用组件挂载完成后调用通常用于发起网络请求、设置定时器等。调用时机组件首次渲染到 DOM 后。
更新阶段Updating static getDerivedStateFromProps(props, state) 作用在组件更新时调用用于根据新的 props 更新 state。调用时机组件接收到新 props 或 state 变化时。 shouldComponentUpdate(nextProps, nextState) 作用决定组件是否需要重新渲染默认返回 true。调用时机组件接收到新 props 或 state 变化时。 render() 作用返回组件的 JSX描述 UI 的结构。调用时机组件实例被创建和每次更新时。 getSnapshotBeforeUpdate(prevProps, prevState) 作用在组件更新前捕获一些信息这些信息可以在 componentDidUpdate 中使用。调用时机组件更新前。 componentDidUpdate(prevProps, prevState, snapshot) 作用组件更新完成后调用通常用于更新 DOM 或发起网络请求。调用时机组件更新后。
卸载阶段Unmounting componentWillUnmount() 作用组件卸载前调用通常用于清理工作如取消网络请求、清除定时器等。调用时机组件从 DOM 中移除前。
2. 什么是 React 的新生命周期方法它们取代了哪些旧方法
React 16.3 引入了一些新的生命周期方法以解决旧方法的一些问题并提高组件的可预测性和安全性。以下是新生命周期方法及其取代的旧方法 static getDerivedStateFromProps(props, state) 取代componentWillReceiveProps作用在组件实例被创建和更新时调用用于根据 props 更新 state。 getSnapshotBeforeUpdate(prevProps, prevState) 取代componentWillUpdate作用在组件更新前捕获一些信息这些信息可以在 componentDidUpdate 中使用。 componentDidCatch(error, info) 新增用于捕获和处理组件树中的错误。作用在组件树中捕获错误时调用可以用于记录错误或显示错误页面。
3. 什么是 getDerivedStateFromProps它的作用是什么
getDerivedStateFromProps 是一个静态方法用于在组件实例被创建和更新时根据 props 更新 state。它是一个纯函数不能执行副作用操作。
作用
同步更新 state确保组件的 state 始终与 props 保持一致。避免不必要的更新通过返回 null可以避免不必要的 state 更新。
示例
class MyComponent extends React.Component {static getDerivedStateFromProps(props, state) {if (props.counter ! state.prevCounter) {return { prevCounter: props.counter, hasChanged: true };}return null;}render() {return (divpCounter: {this.props.counter}/p{this.state.hasChanged pCounter has changed!/p}/div);}
}4. 什么是 getSnapshotBeforeUpdate它的作用是什么
getSnapshotBeforeUpdate 是一个生命周期方法用于在组件更新前捕获一些信息这些信息可以在 componentDidUpdate 中使用。它通常用于捕获 DOM 的当前状态。
作用
捕获 DOM 状态在组件更新前捕获 DOM 的当前状态以便在更新后进行比较或处理。避免闪烁确保在更新后能够平滑地过渡到新的状态。
示例
class ScrollingList extends React.Component {constructor(props) {super(props);this.listRef React.createRef();}getSnapshotBeforeUpdate(prevProps, prevState) {if (prevProps.list.length this.props.list.length) {const list this.listRef.current;return list.scrollHeight - list.scrollTop;}return null;}componentDidUpdate(prevProps, prevState, snapshot) {if (snapshot ! null) {const list this.listRef.current;list.scrollTop list.scrollHeight - snapshot;}}render() {return (div ref{this.listRef}{this.props.list.map(item (div key{item.id}{item.name}/div))}/div);}
}5. 什么是 componentDidCatch它的作用是什么
componentDidCatch 是一个生命周期方法用于捕获和处理组件树中的错误。它类似于 JavaScript 中的 try...catch 语句但作用于 React 组件。
作用
捕获错误在组件树中捕获任何未捕获的错误。记录错误可以用于记录错误信息发送错误报告等。显示错误页面可以用于显示友好的错误页面提升用户体验。
示例
class ErrorBoundary extends React.Component {constructor(props) {super(props);this.state { hasError: false, error: null, info: null };}static getDerivedStateFromError(error) {return { hasError: true, error };}componentDidCatch(error, info) {this.setState({ error, info });// 可以在这里记录错误信息console.error(Caught an error:, error, info);}render() {if (this.state.hasError) {return h1Something went wrong./h1;}return this.props.children;}
}const App () (ErrorBoundaryMyComponent //ErrorBoundary
);Hooks
1. 什么是 Hooks它们解决了什么问题
Hooks 是 React 16.8 引入的新特性允许你在不编写类组件的情况下使用状态和其他 React 特性。Hooks 使得函数组件可以拥有状态和生命周期方法从而提高了代码的可读性和可维护性。
解决的问题
状态管理在函数组件中管理状态而不需要转换为类组件。生命周期方法在函数组件中使用生命周期方法而不需要编写复杂的类组件。逻辑复用通过自定义 Hooks 复用组件逻辑提高代码复用性。代码简洁使得函数组件的代码更加简洁和易读。
2. 请列举并简要说明 React 中常用的 Hooks。
常用 Hooks
useState用于在函数组件中添加状态。useEffect用于在函数组件中执行副作用操作如数据获取、订阅或手动更改 DOM。useContext用于在函数组件中访问 React 的 Context。useReducer用于在函数组件中管理复杂的状态逻辑。useMemo用于 memoize 计算结果避免不必要的计算。useCallback用于 memoize 回调函数避免不必要的重新渲染。useRef用于在函数组件中创建一个可变的引用对象。useImperativeHandle用于自定义暴露给父组件的实例值。useLayoutEffect与 useEffect 类似但在所有的 DOM 变更之后同步调用。useDebugValue用于在 React DevTools 中显示自定义 Hooks 的标签。
3. 什么是 useState它如何工作
useState 是一个 Hook用于在函数组件中添加状态。
工作原理
初始化状态第一次调用 useState 时传入的初始值会被用作初始状态。更新状态返回一个数组第一个元素是当前状态第二个元素是一个用于更新状态的函数。
示例
import React, { useState } from react;const Counter () {const [count, setCount] useState(0);const increment () {setCount(count 1);};const decrement () {setCount(count - 1);};return (divh1Count: {count}/h1button onClick{increment}Increment/buttonbutton onClick{decrement}Decrement/button/div);
};export default Counter;4. 什么是 useEffect它如何工作
useEffect 是一个 Hook用于在函数组件中执行副作用操作如数据获取、订阅或手动更改 DOM。
工作原理
执行副作用在组件挂载和更新时执行副作用操作。清理副作用返回一个可选的清理函数用于在组件卸载或下次执行副作用前清理上一次的副作用。
示例
import React, { useState, useEffect } from react;const DataFetcher () {const [data, setData] useState(null);useEffect(() {const fetchData async () {const response await fetch(/api/data);const json await response.json();setData(json);};fetchData();// 清理函数return () {console.log(Cleanup);};}, []); // 依赖数组为空表示仅在组件挂载时执行return (div{data ? pre{JSON.stringify(data, null, 2)}/pre : pLoading.../p}/div);
};export default DataFetcher;5. 什么是 useContext它如何工作
useContext 是一个 Hook用于在函数组件中访问 React 的 Context。
工作原理
访问 Context传入一个 Context 对象返回该 Context 的当前值。订阅变化当 Context 的值发生变化时使用 useContext 的组件会重新渲染。
示例
import React, { createContext, useContext } from react;// 创建 Context
const ThemeContext createContext();// 提供 Context
const ThemeProvider ({ children }) {const [theme, setTheme] React.useState(light);const toggleTheme () {setTheme(prevTheme prevTheme light ? dark : light);};return (ThemeContext.Provider value{{ theme, toggleTheme }}{children}/ThemeContext.Provider);
};// 使用 Context
const App () {return (ThemeProviderHeader /Content //ThemeProvider);
};const Header () {const { theme, toggleTheme } useContext(ThemeContext);return (header style{{ background: theme light ? #fff : #333, color: theme light ? #000 : #fff }}button onClick{toggleTheme}Toggle Theme/button/header);
};const Content () {const { theme } useContext(ThemeContext);return (div style{{ background: theme light ? #fff : #333, color: theme light ? #000 : #fff }}h1Welcome to the App/h1/div);
};6. 什么是 useReducer它如何工作
useReducer 是一个 Hook用于在函数组件中管理复杂的状态逻辑。
工作原理
定义 Reducer传入一个 reducer 函数该函数接收当前状态和一个 action返回新的状态。初始化状态传入初始状态或一个初始化函数。派发 Action返回一个数组第一个元素是当前状态第二个元素是一个用于派发 action 的函数。
示例
import React, { useReducer } from react;const initialState { count: 0 };const reducer (state, action) {switch (action.type) {case increment:return { count: state.count 1 };case decrement:return { count: state.count - 1 };default:return state;}
};const Counter () {const [state, dispatch] useReducer(reducer, initialState);const increment () {dispatch({ type: increment });};const decrement () {dispatch({ type: decrement });};return (divh1Count: {state.count}/h1button onClick{increment}Increment/buttonbutton onClick{decrement}Decrement/button/div);
};export default Counter;7. 什么是 useMemo 和 useCallback它们的作用是什么
useMemo
作用用于 memoize 计算结果避免不必要的计算。工作原理传入一个计算函数和一个依赖数组只有当依赖数组中的值发生变化时才会重新计算。
示例
import React, { useMemo } from react;const ExpensiveComponent ({ count }) {const expensiveCalculation useMemo(() {console.log(Performing expensive calculation);return count * 1000;}, [count]);return divExpensive Calculation Result: {expensiveCalculation}/div;
};export default ExpensiveComponent;useCallback
作用用于 memoize 回调函数避免不必要的重新渲染。工作原理传入一个回调函数和一个依赖数组只有当依赖数组中的值发生变化时才会返回一个新的回调函数。
示例
import React, { useCallback, useState } from react;const ChildComponent ({ onIncrement }) {return button onClick{onIncrement}Increment/button;
};const ParentComponent () {const [count, setCount] useState(0);const increment useCallback(() {setCount(prevCount prevCount 1);}, []);return (divh1Count: {count}/h1ChildComponent onIncrement{increment} //div);
};export default ParentComponent;8. 什么是 useRef它如何工作
useRef 是一个 Hook用于在函数组件中创建一个可变的引用对象。
工作原理
创建引用返回一个可变的引用对象其 .current 属性可以保存任何值。持久化值引用对象在组件的整个生命周期内保持不变可以用于保存 DOM 节点、计时器等。
示例
import React, { useRef } from react;const FocusInput () {const inputRef useRef(null);const focusInput () {inputRef.current.focus();};return (divinput typetext ref{inputRef} /button onClick{focusInput}Focus Input/button/div);
};export default FocusInput;9. 什么是自定义 Hooks请给出一个实际的例子。
自定义 Hooks 是一种将逻辑提取到可重用函数中的方法。自定义 Hooks 以 use 开头可以组合多个内置 Hooks封装复杂逻辑。
示例 假设我们需要一个自定义 Hook 来处理 API 请求。
import { useState, useEffect } from react;const useFetch (url) {const [data, setData] useState(null);const [loading, setLoading] useState(true);const [error, setError] useState(null);useEffect(() {const fetchData async () {try {const response await fetch(url);if (!response.ok) {throw new Error(Network response was not ok);}const json await response.json();setData(json);} catch (err) {setError(err);} finally {setLoading(false);}};fetchData();}, [url]);return { data, loading, error };
};const DataFetcher () {const { data, loading, error } useFetch(/api/data);if (loading) return pLoading.../p;if (error) return pError: {error.message}/p;return (divpre{JSON.stringify(data, null, 2)}/pre/div);
};export default DataFetcher;性能优化
1. 什么是 React 的性能优化技术请列举并简要说明。
React 提供了多种性能优化技术以提高应用的响应速度和用户体验。以下是一些常见的性能优化技术 Key 作用在列表渲染中为每个列表项提供一个唯一的标识符帮助 React 识别哪些项发生了变化、添加或删除。好处提高虚拟 DOM 的 diff 效率减少不必要的重新渲染。 Code Splitting 作用将应用的代码分割成多个小块按需加载。好处减少初始加载时间提高首屏渲染速度。 Lazy Loading 作用延迟加载组件直到需要时才加载。好处减少初始加载时间提高应用性能。 Memoization 作用缓存计算结果避免不必要的重复计算。好处提高组件的渲染性能减少计算开销。 React.memo 作用对函数组件进行浅比较如果 props 没有变化则跳过重新渲染。好处减少不必要的重新渲染提高性能。 ShouldComponentUpdate 作用在类组件中通过返回布尔值来决定组件是否需要重新渲染。好处减少不必要的重新渲染提高性能。 PureComponent 作用继承自 React.PureComponent 的组件会进行浅比较如果 props 和 state 没有变化则跳过重新渲染。好处减少不必要的重新渲染提高性能。 UseCallback 和 useMemo 作用分别用于 memoize 回调函数和计算结果避免不必要的重新渲染和计算。好处提高组件的渲染性能减少计算开销。 Profiler API 作用用于测量应用的性能找出性能瓶颈。好处帮助开发者优化应用性能提高用户体验。
2. 什么是 Key它在列表渲染中的作用是什么
Key 是 React 用于识别列表中每个元素的唯一标识符。在列表渲染中为每个列表项提供一个唯一的 key 属性可以帮助 React 识别哪些项发生了变化、添加或删除从而提高虚拟 DOM 的 diff 效率。
作用
提高性能通过 keyReact 可以更高效地比对和更新列表项减少不必要的重新渲染。避免错误没有 key 时React 会发出警告并可能导致意外的行为。
示例
import React from react;const ItemList ({ items }) {return (ul{items.map(item (li key{item.id}{item.name}/li))}/ul);
};const items [{ id: 1, name: Apple },{ id: 2, name: Banana },{ id: 3, name: Cherry }
];export default () ItemList items{items} /;3. 什么是 Code Splitting如何在 React 中实现 Code Splitting
Code Splitting 是一种将应用的代码分割成多个小块的技术按需加载这些代码块从而减少初始加载时间提高首屏渲染速度。
实现方法
动态导入使用 import() 语法动态导入模块。React.lazy 和 Suspense结合 React.lazy 和 Suspense 实现组件的懒加载。
示例
import React, { Suspense } from react;
import { BrowserRouter as Router, Route, Switch } from react-router-dom;const Home React.lazy(() import(./components/Home));
const About React.lazy(() import(./components/About));const App () (RouterSuspense fallback{divLoading.../div}SwitchRoute exact path/ component{Home} /Route path/about component{About} //Switch/Suspense/Router
);export default App;4. 什么是 Lazy Loading如何在 React 中实现 Lazy Loading
Lazy Loading 是一种延迟加载组件的技术直到需要时才加载。这可以减少初始加载时间提高应用性能。
实现方法
React.lazy用于声明懒加载的组件。Suspense用于在组件加载时显示一个 fallback UI。
示例
import React, { lazy, Suspense } from react;const HeavyComponent lazy(() import(./HeavyComponent));const App () (divSuspense fallback{divLoading.../div}HeavyComponent //Suspense/div
);export default App;5. 什么是 Memoization如何在 React 中实现 Memoization
Memoization 是一种优化技术通过缓存计算结果来避免不必要的重复计算。在 React 中可以使用 useMemo 和 useCallback 来实现 memoization。
实现方法
useMemo用于 memoize 计算结果。useCallback用于 memoize 回调函数。
示例
import React, { useMemo, useCallback } from react;const ExpensiveComponent ({ count }) {const expensiveCalculation useMemo(() {console.log(Performing expensive calculation);return count * 1000;}, [count]);return divExpensive Calculation Result: {expensiveCalculation}/div;
};const ParentComponent () {const [count, setCount] React.useState(0);const [text, setText] React.useState();const increment useCallback(() {setCount(prevCount prevCount 1);}, []);return (divh1Count: {count}/h1input typetext value{text} onChange{e setText(e.target.value)} /ExpensiveComponent count{count} /button onClick{increment}Increment/button/div);
};export default ParentComponent;路由
1. 什么是 React Router它的主要特点是什么
React Router 是一个用于 React 应用的路由库它允许你在单页应用SPA中实现多页面的导航和路由管理。
主要特点
声明式路由使用声明式的方式来定义路由使代码更加清晰和易于维护。动态路由匹配支持动态参数匹配可以根据 URL 参数动态加载不同的组件。嵌套路由支持嵌套路由可以轻松实现多级嵌套的页面结构。编程式导航提供编程式导航的方法可以在代码中控制页面的跳转。路由守卫支持路由守卫可以在路由切换前后执行特定的逻辑。懒加载支持代码分割和懒加载可以按需加载组件提高应用性能。
2. 如何在 React 中实现路由
在 React 中使用 React Router 实现路由的基本步骤如下 安装 React Router npm install react-router-dom引入必要的组件 jsx
深色版本
import { BrowserRouter as Router, Route, Switch, Link } from react-router-dom;配置路由 import React from react;
import { BrowserRouter as Router, Route, Switch, Link } from react-router-dom;
import Home from ./Home;
import About from ./About;
import Contact from ./Contact;const App () (RouterdivnavulliLink to/Home/Link/liliLink to/aboutAbout/Link/liliLink to/contactContact/Link/li/ul/navSwitchRoute exact path/ component{Home} /Route path/about component{About} /Route path/contact component{Contact} //Switch/div/Router
);export default App;3. 什么是 Route 和 Link它们的作用是什么
Route 作用定义一个路由规则当 URL 匹配时会渲染对应的组件。 属性 path定义匹配的路径。component匹配路径时渲染的组件。exact是否精确匹配路径。render匹配路径时渲染的函数。children匹配路径时渲染的子组件。
示例
Route exact path/ component{Home} /
Route path/about component{About} /Link 作用用于在应用中创建导航链接点击后会改变 URL 并触发路由匹配。 属性 to目标路径。
示例
Link to/Home/Link
Link to/aboutAbout/Link4. 什么是 Switch它的作用是什么
Switch
作用用于包裹多个 Route 组件确保只有一个 Route 被渲染。当找到第一个匹配的 Route 时停止匹配后续的 Route。优点避免多个 Route 同时匹配确保路由的唯一性。
示例
SwitchRoute exact path/ component{Home} /Route path/about component{About} /Route path/contact component{Contact} /
/Switch5. 如何实现嵌套路由
嵌套路由是指在一个路由组件中定义子路由实现多级嵌套的页面结构。
示例
import React from react;
import { BrowserRouter as Router, Route, Switch, Link } from react-router-dom;
import Home from ./Home;
import About from ./About;
import Contact from ./Contact;
import Profile from ./Profile;const App () (RouterdivnavulliLink to/Home/Link/liliLink to/aboutAbout/Link/liliLink to/contactContact/Link/li/ul/navSwitchRoute exact path/ component{Home} /Route path/about component{About} /Route path/contact component{Contact} //Switch/div/Router
);const Contact () (divh2Contact/h2navulliLink to/contact/profileProfile/Link/li/ul/navSwitchRoute path/contact/profile component{Profile} //Switch/div
);export default App;6. 什么是 Redirect它的作用是什么
Redirect 作用用于在组件中进行重定向将用户从当前路径重定向到另一个路径。 属性 from当前路径。to目标路径。push是否将重定向路径添加到历史记录中。
示例
import React from react;
import { BrowserRouter as Router, Route, Switch, Link, Redirect } from react-router-dom;
import Home from ./Home;
import About from ./About;
import Contact from ./Contact;const App () (RouterdivnavulliLink to/Home/Link/liliLink to/aboutAbout/Link/liliLink to/contactContact/Link/li/ul/navSwitchRoute exact path/ component{Home} /Route path/about component{About} /Route path/contact component{Contact} /Redirect from/old-path to/new-path //Switch/div/Router
);export default App;其他
1. 什么是 TypeScript如何在 React 中使用 TypeScript
TypeScript 是一种静态类型的编程语言它是 JavaScript 的超集增加了类型系统和编译时检查。TypeScript 可以帮助开发者提前发现类型错误提高代码质量和可维护性。
如何在 React 中使用 TypeScript 安装 TypeScript npm install typescript types/react types/react-dom --save-dev创建 TypeScript 文件 将 .js 文件改为 .tsx 文件对于 React 组件并在文件顶部添加类型声明。 配置 tsconfig.json 在项目根目录下创建 tsconfig.json 文件配置 TypeScript 编译选项。 {compilerOptions: {target: es5,lib: [dom, dom.iterable, esnext],allowJs: true,skipLibCheck: true,esModuleInterop: true,allowSyntheticDefaultImports: true,strict: true,forceConsistentCasingInFileNames: true,noFallthroughCasesInSwitch: true,module: esnext,moduleResolution: node,resolveJsonModule: true,isolatedModules: true,noEmit: true,jsx: react-jsx},include: [src]
}编写带有类型的 React 组件 import React from react;interface Props {name: string;
}const HelloWorld: React.FCProps ({ name }) {return divHello, {name}!/div;
};export default HelloWorld;2. 什么是 Webpack它的主要功能是什么
Webpack 是一个模块打包工具它可以将各种资源如 JavaScript、CSS、图片等视为模块并将其打包成一个或多个 bundle 文件。
主要功能
模块打包将多个模块打包成一个或多个 bundle 文件。代码分割将代码分割成多个小块按需加载。加载器Loaders 通过加载器处理不同类型的文件如 CSS、图片等。插件Plugins 通过插件扩展 Webpack 的功能如代码压缩、HTML 生成等。热模块替换HMR 在开发过程中实时更新模块无需刷新页面。
示例配置
const path require(path);module.exports {entry: ./src/index.js,output: {filename: bundle.js,path: path.resolve(__dirname, dist)},module: {rules: [{test: /.js$/,exclude: /node_modules/,use: {loader: babel-loader}},{test: /.css$/,use: [style-loader, css-loader]}]},plugins: [// 插件配置],devServer: {contentBase: path.join(__dirname, dist),hot: true}
};3. 什么是 Babel它的主要功能是什么
Babel 是一个 JavaScript 编译器可以将现代 JavaScript 代码转换为向后兼容的版本使其能够在更广泛的环境中运行。
主要功能
语法转换将 ES6 语法转换为 ES5 语法。插件系统通过插件扩展 Babel 的功能如转换装饰器、类属性等。预设预设是一组插件的集合简化配置过程。
示例配置
{presets: [babel/preset-env, babel/preset-react],plugins: [babel/plugin-proposal-class-properties]
}4. 什么是 ESLint它的主要功能是什么
ESLint 是一个用于识别和报告 JavaScript 代码中模式问题的工具旨在统一代码风格并发现潜在错误。
主要功能
代码检查检查代码风格和潜在错误。规则配置通过配置文件自定义检查规则。插件系统通过插件扩展 ESLint 的功能如支持 TypeScript、React 等。
示例配置
{env: {browser: true,es6: true},extends: eslint:recommended,rules: {indent: [error, 2],quotes: [error, double],semi: [error, always]}
}5. 什么是 Jest它的主要功能是什么
Jest 是一个用于 JavaScript 的测试框架特别适合 React 应用的单元测试和集成测试。
主要功能
断言库内置丰富的断言库。模拟函数支持函数和模块的模拟。快照测试自动生成和比对快照确保组件输出的一致性。异步测试支持 Promise 和 async/await 的异步测试。覆盖率报告生成代码覆盖率报告。
示例测试
import React from react;
import { render, fireEvent } from testing-library/react;
import App from ./App;test(renders learn react link, () {const { getByText } render(App /);const linkElement getByText(/learn react/i);expect(linkElement).toBeInTheDocument();
});test(button click increments counter, () {const { getByText } render(App /);const button getByText(Click me);fireEvent.click(button);expect(getByText(Count: 1)).toBeInTheDocument();
});6. 什么是 Enzyme它的主要功能是什么
Enzyme 是一个用于 React 组件的单元测试工具提供了丰富的 API 用于渲染和查询组件。
主要功能
浅渲染只渲染组件的顶层不渲染子组件。完整渲染渲染整个组件树适用于集成测试。静态渲染将组件渲染为静态 HTML适用于无 DOM 环境。选择器提供丰富的选择器 API用于查询和操作组件。
示例测试
import React from react;
import { shallow } from enzyme;
import App from ./App;describe(App /, () {it(renders without crashing, () {const wrapper shallow(App /);expect(wrapper.find(h1).text()).toEqual(Hello, world!);});it(handles button click, () {const wrapper shallow(App /);wrapper.find(button).simulate(click);expect(wrapper.find(p).text()).toEqual(Count: 1);});
});7. 什么是 Storybook它的主要功能是什么
Storybook 是一个用于开发和展示 UI 组件的工具支持 React、Vue、Angular 等多种框架。
主要功能
组件隔离在隔离的环境中开发和展示组件。文档生成自动生成组件文档展示组件的各种状态和用法。交互式 playground提供交互式 playground方便开发者测试和调试组件。插件系统通过插件扩展功能如添加样式指南、性能测试等。
示例配置 安装 Storybook npx sb init编写故事 import React from react;
import { Button } from ./Button;
import { storiesOf } from storybook/react;storiesOf(Button, module).add(with text, () ButtonClick me/Button).add(with emoji, () Button /Button);8. 什么是 Server-Side RenderingSSR如何在 React 中实现 SSR
Server-Side Rendering (SSR) 是一种在服务器端生成 HTML 标记的技术然后将生成的 HTML 发送到客户端浏览器。这可以提高首屏加载速度改善 SEO。
如何在 React 中实现 SSR 安装必要的包 npm install react react-dom express loadable/server创建服务器端渲染文件 // server.js
const express require(express);
const React require(react);
const ReactDOMServer require(react-dom/server);
const App require(./App).default;const app express();app.get(*, (req, res) {const html ReactDOMServer.renderToString(App /);res.send(!DOCTYPE htmlhtmlheadtitleSSR Example/title/headbodydiv idroot${html}/divscript src/static/bundle.js/script/body/html);
});app.listen(3000, () {console.log(Server is running on port 3000);
});创建客户端入口文件 // client.js
import React from react;
import ReactDOM from react-dom;
import App from ./App;ReactDOM.hydrate(App /, document.getElementById(root));9. 什么是 Static Site GenerationSSG如何在 React 中实现 SSG
Static Site Generation (SSG) 是一种在构建时生成静态 HTML 文件的技术然后将这些文件部署到静态文件服务器。这可以提高首屏加载速度降低服务器负载。
如何在 React 中实现 SSG 使用 Next.js 安装 Next.js npx create-next-app my-app
cd my-app创建静态页面 // pages/index.js
import React from react;const Home () {return divWelcome to the Static Site/div;
};export default Home;生成静态文件 npm run build
npm start使用 Gatsby 安装 Gatsby npx gatsby-cli new my-app
cd my-app创建静态页面 // src/pages/index.js
import React from react;const Home () {return divWelcome to the Static Site/div;
};export default Home;生成静态文件 npm run build
npm run serveVue 和 React 的区别
Vue 和 React 都是非常流行的前端框架各有其特点和适用场景。下面详细对比 Vue 和 React 的主要区别
1. 基本概念
React
定义React 是一个用于构建用户界面的 JavaScript 库由 Facebook 开发和维护。核心理念组件化开发虚拟 DOM单向数据流。
Vue
定义Vue 是一个用于构建用户界面的渐进式框架由尤雨溪开发和维护。核心理念组件化开发虚拟 DOM双向数据绑定。
2. 学习曲线
React
学习曲线相对较陡峭需要了解 JSX、状态管理、生命周期方法等概念。文档官方文档详细但内容较多初学者可能需要花费更多时间学习。
Vue
学习曲线较为平缓API 设计友好文档清晰初学者可以快速上手。文档官方文档简洁明了适合快速学习。
3. 模板语法
React 模板语法使用 JSX将 JavaScript 和 HTML 结合在一起需要一定的 JavaScript 基础。 示例 const App () (divh1Hello, {name}!/h1button onClick{() setName(World)}Change Name/button/div
);Vue 模板语法使用类似于 HTML 的模板语法支持指令和插值表达式。 示例 templatedivh1Hello, {{ name }}!/h1button clickchangeNameChange Name/button/div
/templatescript
export default {data() {return {name: Vue};},methods: {changeName() {this.name World;}}
};
/script4. 数据绑定
React 数据绑定单向数据流通过 setState 更新状态。 示例 const [name, setName] useState(React);
const handleChange (event) {setName(event.target.value);
};Vue 数据绑定支持双向数据绑定通过 v-model 实现。 示例 templatedivinput v-modelname /pName: {{ name }}/p/div
/templatescript
export default {data() {return {name: Vue};}
};
/script5. 状态管理
React 状态管理通常使用 Redux 或 MobX 进行全局状态管理。 示例 import { useSelector, useDispatch } from react-redux;const App () {const count useSelector(state state.count);const dispatch useDispatch();const increment () {dispatch({ type: INCREMENT });};return (divpCount: {count}/pbutton onClick{increment}Increment/button/div);
};Vue 状态管理通常使用 Vuex 进行全局状态管理。 示例 templatedivpCount: {{ count }}/pbutton clickincrementIncrement/button/div
/templatescript
import { mapState, mapActions } from vuex;export default {computed: {...mapState([count])},methods: {...mapActions([increment])}
};
/script6. 生态系统
React
生态系统非常丰富有大量的第三方库和工具支持如 Redux、MobX、React Router、Styled Components 等。社区活跃度高社区贡献者众多。
Vue
生态系统也在不断壮大有 Vuex、Vue Router、Vuetify 等官方和第三方库支持。社区虽然不如 React 社区大但也非常活跃特别是在国内有较高的 popularity。
7. 性能
React
性能React 的虚拟 DOM 和高效的 diff 算法确保了良好的性能。优化可以通过代码分割、懒加载、memoization 等技术进一步优化性能。
Vue
性能Vue 也采用了虚拟 DOM 和高效的 diff 算法性能表现良好。优化通过异步组件、懒加载、keep-alive 等技术优化性能。
8. 适用场景
React
适用场景适合大型复杂应用特别是需要高度定制和灵活扩展的应用。企业级应用广泛应用于企业级应用如 Facebook、Instagram 等。
Vue
适用场景适合中小规模应用特别是需要快速开发和迭代的应用。渐进式框架可以逐步引入适合现有项目的改造和升级。
9. 社区和支持
React
社区全球范围内非常活跃有大量的教程、文档和社区支持。支持Facebook 提供官方支持社区贡献者众多。
Vue
社区虽然不如 React 社区大但也在快速增长特别是在国内有较高的 popularity。支持官方文档详细社区活跃有许多中文资源。
总结
React 更适合大型复杂应用需要高度定制和灵活扩展的场景。Vue 更适合中小规模应用需要快速开发和迭代的场景。
文章转载自: http://www.morning.kltsn.cn.gov.cn.kltsn.cn http://www.morning.wgdnd.cn.gov.cn.wgdnd.cn http://www.morning.skrh.cn.gov.cn.skrh.cn http://www.morning.ydryk.cn.gov.cn.ydryk.cn http://www.morning.wxccm.cn.gov.cn.wxccm.cn http://www.morning.kzrbd.cn.gov.cn.kzrbd.cn http://www.morning.rxlk.cn.gov.cn.rxlk.cn http://www.morning.ycnqk.cn.gov.cn.ycnqk.cn http://www.morning.fbtgp.cn.gov.cn.fbtgp.cn http://www.morning.gwkwt.cn.gov.cn.gwkwt.cn http://www.morning.slnz.cn.gov.cn.slnz.cn http://www.morning.lwygd.cn.gov.cn.lwygd.cn http://www.morning.sgwr.cn.gov.cn.sgwr.cn http://www.morning.xgkxy.cn.gov.cn.xgkxy.cn http://www.morning.zrkp.cn.gov.cn.zrkp.cn http://www.morning.wlstn.cn.gov.cn.wlstn.cn http://www.morning.nlkhr.cn.gov.cn.nlkhr.cn http://www.morning.rgkd.cn.gov.cn.rgkd.cn http://www.morning.beeice.com.gov.cn.beeice.com http://www.morning.lsfzq.cn.gov.cn.lsfzq.cn http://www.morning.rcjyc.cn.gov.cn.rcjyc.cn http://www.morning.zrqs.cn.gov.cn.zrqs.cn http://www.morning.kqnwy.cn.gov.cn.kqnwy.cn http://www.morning.mlwpr.cn.gov.cn.mlwpr.cn http://www.morning.tqqfj.cn.gov.cn.tqqfj.cn http://www.morning.fbxdp.cn.gov.cn.fbxdp.cn http://www.morning.hqllj.cn.gov.cn.hqllj.cn http://www.morning.xsszn.cn.gov.cn.xsszn.cn http://www.morning.ynjhk.cn.gov.cn.ynjhk.cn http://www.morning.ptxwg.cn.gov.cn.ptxwg.cn http://www.morning.ggnkt.cn.gov.cn.ggnkt.cn http://www.morning.cwgfq.cn.gov.cn.cwgfq.cn http://www.morning.myrmm.cn.gov.cn.myrmm.cn http://www.morning.hympq.cn.gov.cn.hympq.cn http://www.morning.ydmml.cn.gov.cn.ydmml.cn http://www.morning.qtzk.cn.gov.cn.qtzk.cn http://www.morning.yhpl.cn.gov.cn.yhpl.cn http://www.morning.ltpzr.cn.gov.cn.ltpzr.cn http://www.morning.xhgcr.cn.gov.cn.xhgcr.cn http://www.morning.txtgy.cn.gov.cn.txtgy.cn http://www.morning.kaakyy.com.gov.cn.kaakyy.com http://www.morning.lbssg.cn.gov.cn.lbssg.cn http://www.morning.wnrcj.cn.gov.cn.wnrcj.cn http://www.morning.glpxx.cn.gov.cn.glpxx.cn http://www.morning.bqppr.cn.gov.cn.bqppr.cn http://www.morning.fxkgp.cn.gov.cn.fxkgp.cn http://www.morning.fgtls.cn.gov.cn.fgtls.cn http://www.morning.dzfwb.cn.gov.cn.dzfwb.cn http://www.morning.kztts.cn.gov.cn.kztts.cn http://www.morning.gmdtk.cn.gov.cn.gmdtk.cn http://www.morning.gfkb.cn.gov.cn.gfkb.cn http://www.morning.pbtrx.cn.gov.cn.pbtrx.cn http://www.morning.qnrpj.cn.gov.cn.qnrpj.cn http://www.morning.kyctc.cn.gov.cn.kyctc.cn http://www.morning.tkrdg.cn.gov.cn.tkrdg.cn http://www.morning.zdzgf.cn.gov.cn.zdzgf.cn http://www.morning.dysgr.cn.gov.cn.dysgr.cn http://www.morning.ckxd.cn.gov.cn.ckxd.cn http://www.morning.dhwyl.cn.gov.cn.dhwyl.cn http://www.morning.qcbhb.cn.gov.cn.qcbhb.cn http://www.morning.pcngq.cn.gov.cn.pcngq.cn http://www.morning.hcsqznn.cn.gov.cn.hcsqznn.cn http://www.morning.xblrq.cn.gov.cn.xblrq.cn http://www.morning.rnht.cn.gov.cn.rnht.cn http://www.morning.rbkml.cn.gov.cn.rbkml.cn http://www.morning.ncqzb.cn.gov.cn.ncqzb.cn http://www.morning.fqqcd.cn.gov.cn.fqqcd.cn http://www.morning.qtbnm.cn.gov.cn.qtbnm.cn http://www.morning.fnwny.cn.gov.cn.fnwny.cn http://www.morning.nrqtk.cn.gov.cn.nrqtk.cn http://www.morning.kyzxh.cn.gov.cn.kyzxh.cn http://www.morning.nlygm.cn.gov.cn.nlygm.cn http://www.morning.tgdys.cn.gov.cn.tgdys.cn http://www.morning.lpnb.cn.gov.cn.lpnb.cn http://www.morning.dlurfdo.cn.gov.cn.dlurfdo.cn http://www.morning.lmmyl.cn.gov.cn.lmmyl.cn http://www.morning.wlbwp.cn.gov.cn.wlbwp.cn http://www.morning.mmtbn.cn.gov.cn.mmtbn.cn http://www.morning.yqkxr.cn.gov.cn.yqkxr.cn http://www.morning.ggmls.cn.gov.cn.ggmls.cn