FAQ?
什么是 React?
React 是一种用于构建用户界面的 JavaScript 库。它由 Facebook 开发,可以用于构建单页应用程序和复杂的 UI。
什么是组件?
在 React 中,组件是可以复用的 UI 模块,它们可以接收输入并返回输出。组 件可以分为函数组件和类组件。
React 中如何处理受控组件和非受控组件?
受控组件是指由 React 控制的表单元素,它们的值始终由 React 状态管理。非受控组件是指没有被 React 控制的表单元素。在 React 中,我们可以使用 ref 来获取非受控组件的值。
React 中如何处理组件之间的通信?
在 React 中,我们可以使用 props 和 state 来处理组件之间的通信。另外,我们还可以使用 Context 或 Redux 管理应用程序状态。
什么是异步组件?
异步组件是指在需要时,动态地加载组件。在 React 中,我们可以使用 React.lazy() 和 Suspense API 来实现异步组件加载。
什么是 React 中的渲染属性?
渲染属性是指在 React 中允 许通过属性将一个或多个组件作为其子元素的方法。通过使用渲染属性,我们可以更灵活地定义组件并传递数据。
React 中的合成事件是什么?
合成事件是 React 提供的一种优化后的事件系统,它处理了跨浏览器兼容性问题,通过事件委托实现高效事件处理,而且能够避免浏览器默认行为。在 React 中,我们可以通过 SyntheticEvent 来访问合成事件的属性。
在 React 中如何进行单元测试?
在 React 中,我们可以使用 Jest 和 Enzyme 进行单元测试。我们可以测试组件的渲染和行为,确保组件响应用户的交互。单元测试有助于确保组件的稳定性和可维护性,并帮助我们验证组件是否按预期运行。
什么是渲染道具/children?
在 React 中,每个组件都有一个 props 对象作为输入,可以通过该对象向其传递数据。在某些情况下,我们还可以使用 children 属性,该属性可以让我们向组件传递的内容作为一个或多个子元素。这种技术可以用于可复用的组件,例如 modal 组件、 提示组件等
angularJs和React区别
React 对比 Angular 是思想上的转变,它也并不是一个库,是一种开发理念,组件化,分治的管理,数据与 view 的一体化。它只有一个中心,发出状态,渲染 view,对于虚拟 dom 它并没有提高渲染页面的性能,它提供更多的是利用 jsx 便捷生成 dom 元素,利用组件概念进行分治管理页面每个部分(例如 header section footer slider)
redux中间件
中间件提供第三方插件的模式,自定义拦截 action -> reducer 的过程。变为action -> middlewares -> reducer 。这种机制可以让我们改变数据流,实现如异步 action ,action 过滤,日志输出,异常报告等功能。常见的中间件: redux-logger:提供日志输出;redux-thunk:处理异步操作;redux-promise:处理异步操作;actionCreator 的返回值是 promise
redux有什么缺点
- 状态管理可能过度中央化:Redux 鼓励将应用中的所有状态都存储在单一的状态树中。这可能会导致状态管理过度中央化,使得修改状态变得更加困难,同时也可能会增加组件之间的耦合度。
- 繁琐的模板代码:Redux 需要编写许多模板代码,包括定义 Action 类型、编写 Action 创建函数、编写 Reducer 等。这可能会增加开 发人员的工作量,尤其是对于较小的项目来说,这些额外的代码可能会显得冗余。
- 可能会产生性能问题:由于 Redux 中的所有状态都存储在单一的状态树中,因此在某些情况下,组件可能会在不必要的情况下重新渲染。这可能会对应用的性能产生负面影响。
- 学习曲线陡峭:Redux 使用了许多概念和抽象概念,包括 Action、Reducer、Store、Middleware 等。这些概念可能需要一些时间来理解和学习。
- 可能会导致重复的网络请求:由于 Redux 中的所有状态都存储在单一的状态树中,因此在某些情况下,多个组件可能会对同一个状态进行修改。如果这个状态是异步请求的结果,可能会导致多次发送相同的网络请求,浪费带宽和时间。
总之,Redux 在技术层面上存在一些缺点,使用时需要权衡其优点和缺点,并根据具体情况来选择是否使用它。
React组件的划分业务组件技术组件?
根据组件的职责通常把组件分为 UI 组件和容器组件。UI 组件负责 UI 的呈现,容器组件负责管理数据和逻辑。两者通过 React-Redux 提供 connect 方法联系起来。
为什么虚拟dom会提高性能?
虚拟DOM之所以可以提高性能,是因为它可以进行更有效的DOM操作。
在传统的网页开发中, 当数据变化时,我们需要直接更新DOM元素。这样做会导致浏览器频繁地重新渲染页面,从而降低了性能。而使用虚拟DOM,我们可以在内存中构建整个DOM树,然后将其与前一个版本进行比较来确定变化的部分,最后只更新这些变化的部分,而非整个DOM树。
这样做可以减少不必要的DOM操作,从而提高性能。虚拟DOM还可以将多个操作合并成一个批量操作,从而进一步加快渲染速度。
简述flux 思想
Flux是一种前端应用程序架构的思想,旨在解决传统MVC或MVVM架构中数据流的复杂性。
Flux架构中,数据是单向流动的,用户的操作会产生一个ACTION并交给DISPATCHER,DISPATCHER会把这个ACTION分发给STORE,STORE会修改状态并发出CHANGE事件,VIEW会监听此事件并从STORE获取新的状态并做出相应的更新。
Flux这种架构模式的核心思想是将数据和行为(action)分离,通过强制单向数据流和严格的数据和状态管理来简化应用程序的状态处理逻辑,并确保应用程序始终处于一种可预测和可控的状态。
因此,Flux可以帮助开发人员更轻松地开发和维护复杂的前端应用程序,提高应用程序的性能和可维护性,还可以避免潜在的数据流混乱和状态管理问题。
React项目用过什么脚手架?Mern? Yeoman?
React项目可以使用许多不同的脚手架工具,其中最常用的是Create React App,它是由React团队提供的一个官方命令行工具,用于启动和快速构建React应用程序。Create React App可以自动设置开发环境,包括Webpack和Babel等工具。
除此之外,还有许多其他流行的React项目脚手架,例如Next.js、Gatsby、React Starter Kit 等等。
MERN Stack是一个完整的技术堆栈,包括MongoDB、Express、React和Node.js。因此,如果你要开发一个MERN Stack项目,你可以使用MERN Starter或其他类似的脚手架来快速搭建起整个技术堆栈。
Yeoman是一个通用的脚手架工具,它适用于搭建各种各样的应用程序,包括React应用程序。Yeoman可以通过提供各种所需的模板和工具,快速生成具有特定功能和结构的应用程序。
React解决了什么问题?
React主要解决了以下几个问题:
- 提高JSX的可读性和可维护性:React提供了JSX语法来构建UI组件,它使得编写和维护大规模的组件变得更加容易。开发人员可以使用HTML类似的语法来描述UI组件,同时集成了JavaScript的能力,帮助开发人员更好的理解和管理代码。
- 更高效的渲染性能:React采用了虚拟DOM的概念,可以通过比较前后两个虚拟DOM的差异,只更新需要更新的部分,从而减少了页面的重新渲染次数,提高了应用程序的渲染性能。
- 状态管理和数据流控制:React倡导使用单向数据流应用模型,通过将整个应用程序的状态都保存在一个的Store中,使得应用程序的状态更新更加一致和可控制。这种模型使得多个组件可以共享同一个状态,并可以更细致地控制数据流的传递。
- 组件化开发方式:React推广了组件化开发方式,将UI视为一个组件,可以将UI组件的代码封装为独立的代码块,提高了代码重用性和可维护性。
总之,React解决了前端开发中的一些痛点问题,例如代码维护困难、渲染效率低、数据流控制繁琐等问题,从而帮助开发人员更快速和高效的开发和维护大型前端应用程序。
React的协议?
React本身没有独立的协议,它是一个开源的基于MIT许可证的JavaScript库,任何人都可以自由地使用、复制和修改React的代码。
但是,如果您要使用React为某个项目编写代码并将其公开发布,则必须遵守React的相关条款。这包括在项目中包含React的版权声明、不删除或修改React的许可证、将React的许可证包含在所有的衍生项目中等等。
需要注意的是,如果您使用的是React的前端框架如Gatsby,可能会有额外的协议条款需要遵守,例如Gatsby的默认协议是Apache License 2.0。
总之,React并没有自己的独立协议,它是一个开源的JavaScript库,遵循MIT许可证,但在使用React时需要遵守相关的许可协议。
React 的工作原理?
React 是一种用于创建用户界面的 JavaScript 库,它基于组件的思想,允许您将界面分解为独立且可重用的部分,并在这些组件之间进行交互。
React 的核心工作原理是使用虚拟 DOM(Virtual DOM)来优化 UI 的渲染效率。在 React 中,当组件的状 态发生更改时,虚拟 DOM 会用新的状态重新渲染部分 UI,然后将其与先前的虚拟 DOM 进行比较。这个比较过程非常快速,因为只会对发生更改的部分进行更新,减少了浏览器的开销和重绘。
在 React 中,组件是单向数据流的。当组件的 props 或 state 发生更改时,React 将自动重新渲染组件,并更新底层的虚拟 DOM。这使得 React 在处理大型、动态 UI 时十分高效,因为它只会在必要时更新界面的部分,而不是重新渲染整个界面。
此外,React 还提供了一些其他功能,如生命周期钩子函数、组件之间的通信、事件处理程序等,使开发人员可以更轻松地创建高度可定制和交互性的 UI。
使用 React 有何优点?
使用 React 作为前端框架/库有以下优点:
- 高效的虚拟 DOM:React 使用虚拟 DOM,以最小化对 DOM 的直接操作,尤其是在大量数据变化的情况下速度更快,从而提供了更快的应用程序响应速度和更好的性能。
- 组件化开发:React 的一大特点是组件化开发,可以将整个应用程序拆分成独立的组件,以组合的方式进行开发,提高了代码重用性、可维护性和可测试性。
- 单向数据流:React 采用单向数据流,它将数据从父组件传递到子组件,使组件的关系更加明确,数据更安全,代码更容易维护。
- JSX 语法:React 使用 JSX 语法编写组件,它使组件代码更易于阅读,同时也允许开发者将 HTML 标记和 JavaScript 代码混合使用,从而简化了代码编写流程。
- 社区活跃:React 拥有庞大的社区和强大的生态系统,开发者可以轻松地找到很多第三方库和插件来扩展应用程序的功能和性能。
总的来说,React 是一个功能强大、性能卓越的前端框架,它的灵活性和可扩展性使得开发者可以轻松地构建高质量的应用程序。
展示组件(Presentational component)和容器组件(Container component)之间有何不同?
展示组件(Presentational component)和容器组件(Container component)是 React 组件的两种基本类型,它们通常被用于不同的目的。
展示组件(Presentational component)
展示组件是负责根据输入(props)和状态(state)生成用于展示数据的视图部分。它们通常不包含逻辑代码,而是只负责 UI 的呈现。它们使用组合和属性传递来接收数据,并渲染渲染视图,但并不知道应用程序的状态或需要进行哪些操作。展示组件还通常以静态形式存在,因为它们不受外部输入的影响而单独进行绘制。
容器组件(Container component)
容器组件是负责管理应用程序的状态、处理数据流以及关注业务逻辑的组件。它们通过 props 传递数据到子组件,并且也负责将子组件中发生的事件通过回调函数传递给其他组件。它们并不直接负责 UI 的渲染,而是将任务委托给展示组件。在 React 中,容器组件通常包含代码逻辑和状态管理的整个代码结构,因为它们负责将业务逻辑与展示逻辑分离,从而使应用程序更具有可维护性和可测试性。
总的来说,容器组件负责管理数据和状态,展示组件负责根据输入和状态渲染 UI。 这两种组件通过属性传递和回调函数相互作用,从而创建大型和高度可复用的 React 组件。
类组件(Class component)和函数式组件(Functional component)之间有何不同?
类组件(Class component)
类组件是使用 ES6 类定义的,它们是 React 组件的最初实现方式。类组件通常包含状态(state)和生命周期方法(lifecycle methods),它们还可以通过 this 引用访问实例变量以及继承命名方法。
以下是一个简单的类组件的示例:
import React, { Component } from 'react';
class Welcome extends Component {
render() {
return <h1>Hello, {this.props.name}!</h1>;
}
}
函数式组件(Functional component)
函数式组件是使用函数定义的,它们通常更加简单和精简。函数式组件通常不包含状态或生命周期方法,它们只接收输入 props 并返回呈现的内容。
以下是一个简单的函数式组件的示例:
import React from 'react';
function Welcome(props) {
return <h1>Hello, {props.name}!</h1>;
}
除此之外,React 自从 16.8 版本之后,还引入了 Hooks API,它使得函数式组件中能够使用状态和其他特性。使用 Hooks,函数式组件可以方便地替代类组件完成复杂的应用程序逻辑。函数式组件与类组件的比较:
- 函数式组件通常比类组件更加简单。
- 类组件可以定义 state 和 lifecycle 方法。
- 使用 Hooks,函数式组件也可以定义 state 和其他特性。
总的来说,函数式组件具有更少的代码和更快的渲染速度,但是,如果需要使用状态和生命周期方法,那么类组件是更好的选择。
应该在 React 组件的何处发起 Ajax 请求?
在 React 组件中发起 Ajax 或其他异步请求时,最好的实践是在组件生命周期的 componentDidMount 方法中发起这些请求。
在这种情况下,当组件挂载完成时,React 提供了一个机会来向数据库或 API 发送请求以获取数据,并将其保存在组件的状态中,以便在呈现组件时使用。
以下是一个使用 componentDidMount 发起 Ajax 请求的示例:
import React, { Component } from 'react';
import axios from 'axios';
class MyComponent extends Component {
state = {
data: null,
}
componentDidMount() {
axios.get('/api/data')
.then(response => {
// 处理数据并将其保存在状态中
this.setState({ data: response.data });
})
.catch(error => {
console.error(error);
});
}
render() {
return (
<div>
{/* 使用状态中的数据呈现组件 */}
{this.state.data && <p>{this.state.data}</p>}
</div>
)
}
}
在这个示例中,我们使用 componentDidMount 方法向服务器发起 AJAX 请求,并将返回的数据保存在组件的状态中。当数据准备好时,我们使用呈现方法将其渲染到组件。这种方法能够确保组件只在挂载后才发起请求,并且只在服务器响应时才进行数据处理。
在 React 中,refs 的作用是什么?
在 React 中,refs提供了一种方式可以从组件中获取DOM节点或者React组件的引用。refs是React提供的一种访问真实DOM及React组件的方法,可以用于访问和操作在组件实例内部的DOM元素、组件实例和组件实例内的方法。
使用refs,可以在React中控制和访问DOM元素的方法,包括获取表单元素中输入的值,聚焦表单元素,滚动到指定位置等。另外,refs也可以用于父组件和子组件之间的通信,可以让父组件直接访问子组件的props和state,这样可以使得组件之间的数据传递更加直接和高效。
在具体应用中,使用 refs的方式为在需要引用的DOM元素或组件上添加 ref 属性,然后在组件中通过 this.refs.xxx的方式来访问对应的节点或组件实例。需要注意的是,使用refs方式有时会导致代码结构复杂度增加,同时也增加了组件之间的耦合度,所以应该在必要的时候才使用。
何为高阶组件(higher order component)?
高阶组件(Higher-Order Component,HOC)是一个可以接收一个或多个组件作为参数,并返回一个新组件的函数。 这个新组件具备了被包装的组件所没有的能力。
高阶组件是 React 中的一种高级技术,用于在组件之间共享代码和行为,从而实现代码重用和抽象化。 它通常被用来编写通用的功能,如身份验证、数据获取、日志记录等。
具体来说,HOC 是一个函数,接收一个组件作为参数,返回一个新的组件。新组件可以在不修改原组件的情况下增强其功能。实际上,HOC 返回了一种新的组件,这个新的组件可以操作被包装组件的 props 或者增强其渲染方法,并且可以通过被包装的组件调用来实现共享所需的函数或逻辑。
以下是一个简单的高阶组件示例:
function withLogger(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} />;
}
}
}
在这个示例中,withLogger 是一个高阶组件,它接收一个组件作为参数并返回一个新的组件。新组件可以在加载和卸载时打印日志。被包装的组 件可以在需要的情况下添加日志功能,而不会在组件本身中混杂日志代码。
在使用时,可以通过以下方式使用:
class MyComponent extends React.Component {
render() {
return <div>Hello, World!</div>;
}
}
const MyComponentWithLogger = withLogger(MyComponent);
在这个示例中,MyComponent 将通过 withLogger 函数进行包装,生成一个新的组件 MyComponentWithLogger,这个新 组件可以增强渲染方法并包含日志功能。 HOC 在 React 中非常常见,常用于编写可重用代码、添加共享功能并向组件注入所需的属性。
为什么建议传递给 setState 的参数是一个 callback 而不是一个对象?
在 React 中,setState 方法用于更新组件的状态(state)。尽管 setState 可以接受一个新的状态对象,但是官方文档建议使用一个回调函数来代替对象来调用 setState,因为在许多情况下这会更加可靠。
以下是使用回调函数的方式来进行 setState 操作的示例:
this.setState(prevState => ({
counter: prevState.counter + 1
}));
以下是使用对象来进行 setState 操作的示例:
this.setState({
counter: this.state.counter + 1
});
这种情况下,推荐使用回调函数的原因有以下几点:
-
异步更新状态
setState 调用是异步的,React 会将更新的状态入列并根据需要进行批处理。如果在调用 setState 时只传递一个对象,则不能确保属性当前将传递给 setState 的对象的值。 因此,在 setState 中传递回调函数,而不是对象,可以确保在异步执行的 状态更新中使用最新的值。
-
避免状态竞争
使用回调函数而不是对象,还可以避免状态竞争(State Race Condition)。例如,如果两个或多个 setState 调用同时发生,并且它们试图更新相同的状态,则无法确保更新的顺序。由于 setState 回调是逐个执行的,因此使用回调函数来进行状态更新将确保它们按顺序执行。
-
更好的性能
在使用回调函数时,可以在回调函数中只更新状态中某个属性。当尝试更新状态时,React 将对新状态和旧状态进行比较,然后只更新发生更改的状态,以此来提高性能并减少系统资源的消耗。
综上所述,使用回调函数来调用 setState 操作通常是一种更加可靠和安全的选择,可以避免状态竞争,提高性能,并且确保在异步执行的状态更新中始终使用最新的值。
除了在构造函数中绑定 this,还有其它方式吗?
是的,除了在构造函数中绑定this之外,还有其他两种常见的方式来绑定 this。
第一种方式是使用箭头函数。箭头函数不会创建自己的作用域,而是会捕捉当前上下文中的 this 值。因此,可以在组件中使用箭头函数来绑定this的值,而不用将this绑定在构造函数中。
例如:
class MyComponent extends React.Component {
handleClick = () => {
console.log(this);
};
render() {
return <button onClick={this.handleClick}>Click me</button>;
}
}
在上面的代码中, handleClick 使用箭头函数定义,因此它的 this 值会指向 MyComponent 组件实例。
第二种方式是使用 bind 方法。bind 方法会创建一个新的函数实例,并绑定该函数实例的 this 值为指定的值。可以在需绑定this的函数中调用 bind,来获取绑定this 后的新函数,并将这个新函数传递给需要调用它的组件或者其他地方使用。
例如:
class MyComponent extends React.Component {
handleClick() {
console.log(this);
}
render() {
return <button onClick={this.handleClick.bind(this)}>Click me</button>;
}
}
在上面的代码中, handleClick 方法中使用了 bind 方法来绑定this值,然后将绑定this后的新函数作为onClick属性的值传递给button组件,在用户点击button时,绑定this后的新函数会被调用。
怎么阻止组件的渲染?
在React中,我们可以使用shouldComponentUpdate生命周期方法来阻止组件的渲染。当shouldComponentUpdate返回false时,React将不会执行组件的重新渲染操作。
shouldComponentUpdate方法是一个用于控制组件是否需要重新渲染的生命周期方法。它接收两个参数:nextProps和nextState。我们可以在shouldComponentUpdate方法中比较当前的props和state与下一个props和state是否发生变化,如果没有变化,则返回false来阻止组件的渲染。
下面是一个示例代码:
class MyComponent extends React.Component {
shouldComponentUpdate(nextProps, nextState) {
// 比较当前的props和state与下一个props和state是否相等
if (this.props.someProp === nextProps.someProp && this.state.someState === nextState.someState) {
return false; // 返回false来阻止组件的重新渲染
}
return true; // 返回true来允许组件的重新渲染
}
render() {
// 组件的渲染逻辑
return (
<div>
// ...
</div>
);
}
}
需要注意的是,使用shouldComponentUpdate方法时需要谨慎,因为它可能会对应用程序的性能产生影响。过于频繁地在shouldComponentUpdate方法中进行比较操作会影响应用程序的性能,因此应该在必要的情况下才使用该方法。
对于函数组件,我们可以使用React.memo()函数来阻止组件的重新渲染。React.memo()是一个高阶组件,它可以接收一个组件作为参数,并返回一个经过优化后的组件。
React.memo()基于浅层比较来判断组件是否需要重新渲染。如果组件的props发生了变化,React.memo()会对新旧props进行浅层比较,如果发现props没有变化,则返回上一次的渲染结果,否则重新渲染组件。React.memo()可以显著提高函数组件的性能,特别是当组件的props较多时。
下面是一个示例代码:
import React from 'react';
function MyComponent(props) {
// 组件的渲染逻辑
return (
<div>
// ...
</div>
);
}
export default React.memo(MyComponent);
需要注意的是,React.memo()只适用于props是基本数据类型的情况。如果props是对象、数组或函数时,需要进行深层比较才能判断是否需要重新渲染组件,这时候需要手动使用shouldComponentUpdate()或shouldUpdateComponent()。
当渲染一个列表时,何为 key?设置 key 的目的是什么?
在React中,当渲染一个列表时,key是一个用于标识列表中每个子元素的唯一标识 符。key通常是一个字符串或数字类型,它被指定在列表中的每个子元素上,并用于帮助React在列表中找到和识别每个子元素。 key的设置是通过设置元素的key属性来实现的。
设置key的目的是帮助React提高渲染性能。如果没有key,React将会在列表中遍历每个子元素来找到改变的元素,造成性能上的浪费。而有了唯一的key,React在进行列表元素比较时就可以精准地定位到每个子元素的位置,只更新变更的部分,从而提高了应用程序的性能。
此外,设置key还可以帮助React正确地跟踪和处理列表元素的状态。当子元素在列表中添加、删除或重新排序时,key可以确保React更新相应的DOM元素,并且在进一步操作过程中能够正确识别元素的状态。
在 React 中如何处理事件
为了解决跨浏览器的兼容性问题,SyntheticEvent 实例将被传递给你的事件处理函数,SyntheticEvent是 React 跨浏览器的浏览器原生事件包装器,它还拥有和浏览器原生事件相同的接口,包括 stopPropagation() 和 preventDefault()。
比较有趣的是,React 实际上并不将事件附加到子节点本身。React 使用单个事件侦听器侦听顶层的所有事件。这对性能有好处,也意味着 React 在更新 DOM 时不需要跟踪事件监听器。
如何创建 refs
Refs 是使用 React.createRef() 创建的,并通过 ref 属性附加到 React 元素。在构造组件时,通常将 Refs 分配给实例属性,以便可以在整个组件中引用它们。
在构造函数调用 super 并将 props 作为参数传入的作用是啥?
在调用 super() 方法之前,子类构造函数无法使用this引用,ES6 子类也是如此。将 props 参数传递给 super() 调用的主要原因是在子构造函数中能够通过this.props来获取传入的 props。
传递 props
class MyComponent extends React.Component { constructor(props) { super(props); console.log(this.props); // { name: 'sudheer',age: 30 } }}
没传递 props
class MyComponent extends React.Component { constructor(props) { super(); console.log(this.props); // undefined // 但是 Props 参数仍然可用 console.log(props); // Prints { name: 'sudheer',age: 30 } } render() { // 构造函数外部不受影响 console.log(this.props) // { name: 'sudheer',age: 30 } }}
上面示例揭示了一点。props 的行为只有在构造函数中是不同的,在构造函数之外也是一样的。
什么是控制组件?
在 HTML 中,表单元素如 <input>、<textarea>和<select>通常维护自己的状态,并根据用户输入进行更新。当用户提交表单时,来自上述元素的值将随表单一起发送。
而 React 的工作方式则不同。包含表单的组件将跟踪其状态中的输入值,并在每次回调函数(例如onChange)触发时重新渲染组件,因为状态被更新。以这种方式由 React 控制其值的输入表单元素称为受控组件。
如何 React.createElement ?
问题:
const element = ( <h1 className="greeting"> Hello, world! </h1>)
上述代码如何使用 React.createElement 来实现:
const element = React.createElement( 'h1', {className: 'greeting'}, 'Hello, world!');
讲讲什么是 JSX ?
当 Facebook 第一次发布 React 时,他们还引入了一种新的 JS 方言 JSX,将原始 HTML 模板嵌入到 JS 代码中。JSX 代码本身不能被浏览器读取,必须使用Babel和webpack等工具将其转换为传统的JS。很多开发人员就能无意识使用 JSX,因为它已经与 React 结合在一直了。
为什么不直接更新 state 呢 ?
如果试图直接更新 state ,则不会重新渲染组件。
// 错误This.state.message = 'Hello world';
需要使用setState()方法来更新 state。它调度对组件state对象的更新。当state改变时,组件通过重新渲染来响应:
// 正确做法This.setState({message: ‘Hello World’});