• react面试题详解


    React-Router怎么设置重定向?

    使用组件实现路由的重定向:

    <Switch>
      <Redirect from='/users/:id' to='/users/profile/:id'/>
      <Route path='/users/profile/:id' component={
       Profile}/>
    </Switch>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    当请求 /users/:id 被重定向去 '/users/profile/:id'

    • 属性 from: string:需要匹配的将要被重定向路径。
    • 属性 to: string:重定向的 URL 字符串
    • 属性 to: object:重定向的 location 对象
    • 属性 push: bool:若为真,重定向操作将会把新地址加入到访问历史记录里面,并且无法回退到前面的页面。

    当调用 setState的时候,发生了什么操作?**

    当调用 setState时, React做的第一件事是将传递给setState的对象合并到组件的当前状态,这将启动一个称为和解( reconciliation)的过程。
    和解的最终目标是,根据这个新的状态以最有效的方式更新DOM。
    为此, React将构建一个新的 React虚拟DOM树(可以将其视为页面DOM元素的对象表示方式)。
    一旦有了这个DOM树,为了弄清DOM是如何响应新的状态而改变的, React会将这个新树与上一个虚拟DOM树比较。
    这样做, React会知道发生的确切变化,并且通过了解发生的变化后,在绝对必要的情况下进行更新DOM,即可将因操作DOM而占用的空间最小化。

    为什么要使用 React. Children. map( props. children,( )=>)而不是props. children. map ( (  ) => )?

    因为不能保证 props. children将是一个数组。
    以下面的代码为例。

    <Parent>
        <h1>有课前端网</h1>
    </Parent>
    
    • 1
    • 2
    • 3

    在父组件内部,如果尝试使用 props.children. map映射子对象,则会抛出错误,因为props. children是一个对象,而不是一个数组。
    如果有多个子元素, React会使 props.children成为一个数组,如下所示。

    <Parent>
      <h1>有课前端网</h1>
      <h2>前端技术学习平台</h2>
    </Parent>;
    //不建议使用如下方式,在这个案例中会抛出错误。
    
    class Parent extends Component {
       
      render() {
       
        return <div> {
       this.props.children.map((obj) => obj)}</div>;
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    建议使用如下方式,避免在上一个案例中抛出错误。

    class Parent extends Component {
       
      render() {
       
        return <div> {
       React.Children.map(this.props.children, (obj) => obj)}</div>;
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    概述一下 React中的事件处理逻辑。

    为了解决跨浏览器兼容性问题, React会将浏览器原生事件( Browser Native Event)封装为合成事件( Synthetic Event)并传入设置的事件处理程序中。
    这里的合成事件提供了与原生事件相同的接口,不过它们屏蔽了底层浏览器的细节差异,保证了行为的一致性。另外, React并没有直接将事件附着到子元素上,而是以单一事件监听器的方式将所有的事件发送到顶层进行处理(基于事件委托原理)。
    这样 React在更新DOM时就不需要考虑如何处理附着在DOM上的事件监听器,最终达到优化性能的目的。

    diff算法是怎么运作

    每一种节点类型有自己的属性,也就是prop,每次进行diff的时候,react会先比较该节点类型,假如节点类型不一样,那么react会直接删除该节点,然后直接创建新的节点插入到其中,假如节点类型一样,那么会比较prop是否有更新,假如有prop不一样,那么react会判定该节点有更新,那么重渲染该节点,然后在对其子节点进行比较,一层一层往下,直到没有子节点

    为什么虚拟dom会提高性能

    虚拟dom相当于在js和真实dom中间加了一个缓存,利用dom diff算法避免了没有必要的dom操作,从而提高性能

    具体实现步骤如下

    • JavaScript 对象结构表示 DOM 树的结构;然后用这个树构建一个真正的 DOM 树,插到文档当中
    • 当状态变更的时候,重新构造一棵新的对象树。然后用新的树和旧的树进行比较,记录两棵树差异
    • 把2所记录的差异应用到步骤1所构建的真正的DOM树上,视图就更新

    虚拟DOM一定会提高性能吗?

    很多人认为虚拟DOM一定会提高性能,一定会更快,其实这个说法有点片面,因为虚拟DOM虽然会减少DOM操作,但也无法避免DOM操作

    • 它的优势是在于diff算法和批量处理策略,将所有的DOM操作搜集起来,一次性去改变真实的DOM,但在首次渲染上,虚拟DOM会多了一层计算,消耗一些性能,所以有可能会比html渲染的要慢
    • 注意,虚拟DOM实际上是给我们找了一条最短,最近的路径,并不是说比DOM操作的更快,而是路径最简单

    参考:前端react面试题详细解答

    在 ReactNative中,如何解决8081端口号被占用而提示无法访问的问题?

    在运行 react-native start时添加参数port 8082;在 package.json中修改“scripts”中的参数,添加端口号;修改项目下的 node_modules \react-native\local- cli\server\server.js文件配置中的 default端口值。

    在 ReactNative中,如何解决 adb devices找不到连接设备的问题?

    在使用 Genymotion时,首先需要在SDK的 platform-tools中加入环境变量,然后在 Genymotion中单击 Setting,选择ADB选项卡,单击 Use custom Android SDK tools,浏览本地SDK的位置,单击OK按钮就可以了。启动虛拟机后,在cmd中输入 adb devices可以查看设备。

    react性能优化是哪个周期函数

    shouldComponentUpdate 这个方法用来判断是否需要调用render方法重新描绘dom。因为dom的描绘非常消耗性能,如果我们能在shouldComponentUpdate方法中能够写出更优化的dom diff算法,可以极大的提高性能

    createElement 与 cloneElement 的区别是什么

    createElement 函数是 JSX 编译之后使用的创建 React Element 的函数,而 cloneElement 则是用于复制某个元素并传入新的 Props

    在 Redux中使用 Action要注意哪些问题?

    在Redux中使用 Action的时候, Action文件里尽量保持 Action文件的纯净,传入什么数据就返回什么数据,最妤把请求的数据和 Action方法分离开,以保持 Action的纯净。

    使用状态要注意哪些事情?

    要注意以下几点。

    • 不要直接更新状态

    • 状态更新可能是异步的

    • 状态更新要合并。

    • 数据从上向下流动

    如果创建了类似于下面的 Icketang元素,那么该如何实现 Icketang类?

    <Icketang username="雨夜清荷">{
       
    • 1
  • 相关阅读:
    揭秘古代手术工具与技术:从中国起源的医疗奇迹
    C++模板初阶
    大数据开发工程师面试题
    Redis的数据类型以及应用场景
    机器学习(二十六):批量机器学习算法的最佳模型选取与最佳超参数获取(入门)
    Python Rich:美化终端显示效果
    命令模式-
    MongoDB
    代码随想录刷题|LeetCode 198.打家劫舍 213.打家劫舍II 337.打家劫舍III
    24.面向对象六大原则
  • 原文地址:https://blog.csdn.net/beifeng11996/article/details/127915448