十道前端面试题第【07】篇

2021-05-19  本文已影响0人  夏海峰

1、字节跳动三面之React面试

2、描述 Diff运算过程,如何比较两个虚拟DOM的差异?

Diff运算

3、伪代码封装 react-redux 库的connect函数

export default function connect(mapStateToProps, mapDispatchToProps, mergeProps, options = {}) {
  return function wrapWithConnect(WrappedComponent) {
    class Connect extends Component {
      constructor(props, context) {
        // 从祖先Component处获得store
        this.store = props.store || context.store
        this.stateProps = computeStateProps(this.store, props)
        this.dispatchProps = computeDispatchProps(this.store, props)
        this.state = { storeState: null }
        // 对stateProps、dispatchProps、parentProps进行合并
        this.updateState()
      }
      shouldComponentUpdate(nextProps, nextState) {
        // 进行判断,当数据发生改变时,Component重新渲染
        if (propsChanged || mapStateProducedChange || dispatchPropsChanged) {
          this.updateState(nextProps)
            return true
          }
        }
        componentDidMount() {
          // 改变Component的state
          this.store.subscribe(() = {
            this.setState({
              storeState: this.store.getState()
            })
          })
        }
        render() {
          // 生成包裹组件Connect
          return (
            <WrappedComponent {...this.nextState} />
          )
        }
      }
      Connect.contextTypes = {
        store: storeShape
      }
      return Connect;
    }
}

4、从React的角度,有哪些性能优化的策略。

类组件中的优化手段:

函数式组件中的优化手段:

其他方式:

5、有哪些定义React组件的方式

# 函数式组件
const PureComponent = (props) => (
    <div>
        //use props
    </div>
)
# 类组件
class StatefulComponent extends Component {
    constructor(props) {
        super(props);
        this.state = { }
    }
    render() {
        return ();
    }
}
# 容器组件
var UserListContainer = React.createClass({
  getInitialState: function() {
    return {
      users: []
    }
  },
  render: function() {
    return (<UserList users={this.state.users} />);
  }
})
# 高阶组件
const HigherOrderComponent = (WrappedComponent) => {
  return class WrapperComponent extends Component {
    render() {
      <WrappedComponent />
    }
  }
}
# Render Callback组件
class RenderCallbackCmp extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      msg: "hello"
    };
  }

  render() {
    return this.props.children(this.state.msg);
  }
}

const ParentComponent = () =>(
  <RenderCallbackCmp>
    {msg =><div>{msg}</div>}
  </RenderCallbackCmp>
)

6、React中组件间通信,有哪些办法?

7、谈一谈 React Hooks API

什么Hooks?Hooks有什么用?常用的Hooks有哪些?

自定义 useTitle 改变文档页面的 title

import { useEffect } from 'react'

const useTitle = (title) => {
    useEffect(() => {
      document.title = title
    }, [])
    return
}
export default useTitle

封装 useReducer 使用 Redux状态管理工具

function useReducer(reducer, initialState) {
  const [state, setState] = useState(initialState);
  function dispatch(action) {
    const nextState = reducer(state, action);
    setState(nextState);
  }
  return [state, dispatch];
}

// 使用 useReducer
function Todos() {
  const [todos, dispatch] = useReducer(todosReducer, [])
  function handleAddClick(text) {
    dispatch({ type: 'add', text })
  }
}

社区里面还有很多好用的自定义Hooks

使用上下文和自定义Hooks实现国际化

import React, { useContext } from 'react'
const LangContext = React.createContext()

export function useLang() {
    return useContext(LangContext)
}
export const LangProvider = LangContext.Provider
# App.jsx
<LangProvider value={qfLang}>
  <Layout />
</LangProvider>

8、React技术栈中,有哪些代码复用的技巧?

9、高阶组件有哪些应用场景?

高阶组件 不是组件,是 一个把某个组件转换成另一个组件的 函数。高阶组件的主要作用是 代码复用。高阶组件是 装饰器模式在 React 中的实现。

10、React路由相关

React-Router官方文档

本周结束,下周继续!!!

上一篇下一篇

猜你喜欢

热点阅读