面试题分享

一、React常用的生命周期?功能?

1、constructor()

constructor()构造函数,构造函数,在组件创建的时候调用一次。完成了React数据的初始化,它接受两个参数:props和context,当想在函数内部使用这两个参数时,需 使用super()传入这两个参数。

注意:

可以不写constructor,一旦写了constructor,就必须在此函数中写super(),

此时组件才有自己的this,在组件的全局中都可以使用this关键字,

否则如果只是constructor 而不执行 super() 那么以后的this都是错的!!!

如果constructor中不通过super来接收props,在其他生命周期,诸如componentWillMount、componentDidMount、render中能直接使用this.props吗??

结论:可以的,react在除了constructor之外的生命周期已经传入了this.props了,完全不受super(props)的影响

2、componentWillMount()

在组件挂载之前( render()之前 )调用。可以用于加载 Loading 条了等操作。

componentWillMount()一般用的比较少,它更多的是在服务端渲染时使用。它代表的过程是组件已经经历了constructor() 初始化数据后,但是还未渲染DOM时。

3、render()

render 只是用来渲染组件。

4、componentDidMount()

在组件挂载之后调用。可以用于耗时操作(请求服务器或定时器等)

5、componentWillUnmount ()

清除你在组建中所有的setTimeout,setInterval

移除所有组建中的监听 removeEventListener

更新过程

  • componentWillReceiveProps (nextProps)
  • shouldComponentUpdate(nextProps,nextState)
  • componentWillUpdate (nextProps,nextState)
  • componentDidUpdate(prevProps,prevState)

二、父子组件通信?

父组件向子组件通信

// 父组件传递
<Test title={'测试页面标题'} tip={'付款时间节点'} /> 

// 子组件接收
render(){
  return(
     <div>
       <div>{this.props.title}</div>
       <div>{this.props.tip}</div>
     </div>
   )
}

子组件向父组件通信
 

// 父组件传递
<Test updateFun={this.undateFun} /> 

undateFun = (val: any) => {
    console.log('此处可以接受子组件传过来的参数')
}
// 子组件接收
render(){
  return(
     <div>
        <button onClick={() => this.props.undateFun('我来源于子组件')}>按钮</button>
     </div>
   )
}

三、Vue中computed,watch,methods的区别?

computed的目的就是能使模板中的运算逻辑更简单

computed 应用场景

1. 适用于一些重复使用数据或复杂及费时的运算。我们可以把它放入computed中进行计算, 然后会在computed中缓存起来, 下次就可以直接获取了。

2. 如果我们需要的数据依赖于其他的数据的话, 我们可以把该数据设计为computed中。

<body>
  <div id="app">
    <p>原来的数据: {{ msg }}</p>
    <div>第一次调用computed属性: {{ reversedMsg }}</div>
    <div>第二次调用computed属性: {{ reversedMsg }}</div>
    <!-- 下面是methods调用 -->
    <div>第一次调用methods方法: {{ reversedMsg1() }}</div>
    <div>第二次调用methods方法: {{ reversedMsg1() }}</div>
  </div>
  <script type="text/javascript">
    var vm = new Vue({
      el: '#app',
      data: {
        msg: 'hello'
      },
    
      computed: {
        reversedMsg() {
          console.log(1111);
          return this.msg.split('').reverse().join('')
        }
      }
   
      methods: {
        reversedMsg() {
          console.log(2222);
          return this.msg.split('').reverse().join('')
        }
      }
    });
    console.log(vm);
  </script>
</body>

watch的使用场景是:

当在data中的某个数据发生变化时, 我们需要做一些操作, 或者当需要在数据变化时执行异步或开销较大的操作时. 我们就可以使用watch来进行监听。


watch普通监听

watch: {
    age(newVal, oldVal) {
        this.basicMsg = '今年' + newVal + '岁' + ' ' + this.single;
    }
}

watch深度监听

watch: {
    age: {
       handler(newVal, oldVal) {
          this.basicMsg = '今年' + newVal + '岁' + ' ' + this.single;
       },
       immediate: true,
       // deep: true // 需要添加deep为true即可对obj进行深度监听
    }
}

immediate设为true后,则监听的这个对象会立即输出,也就是说一刷新页面就会在控制台输出,

watch 和 computed的区别是:

相同点:他们两者都是观察页面数据变化的。

不同点:computed只有当依赖的数据变化时才会计算, 当数据没有变化时, 它会读取缓存数据。
watch每次都需要执行函数。watch更适用于数据变化时的异步操作。

四、React 中,cloneElement 与 createElement 各是什么,有什么区别?

        1、cloneElement,根据Element生成新的Element

        2、createElement,根据Type生成新的Element

React.cloneElement 是复制元素
React.createElement是创建元素

React.createElement():JSX 语法就是用 React.createElement()来构建 React 元素的。

它接受三个参数,第一个参数可以是一个标签名。如 div、span,或者 React 组件。第二个参数为传入的属性。第三个以及之后的参数,皆作为组件的子组件。

React.cloneElement()与 React.createElement()相似,不同的是它传入的第一个参数是一个 React 元素,而不是标签名或组件。新添加的属性会并入原有的属性,传入到返回的新元素中,而旧的子元素将被替换。将保留原始元素的键和引用。

五、React中的setState用法。

定义一个合适的State,是正确创建组件的第一步。因为有一些变量不需要响应式的使用,如果使用了state,就会给这个变量增加一些响应式挂载,

判断是否可以做为一个state的条件:

        1、变量如果是通过props从父组件中获取,就不是一个状态

        2、如果这个变量可以通过其他的状态state或者属性props 通过数据处理得到,就不是一个状态

  3、如果变量在render中没有使用到,那就不是一个state

        4、变量在整个生命周期中都保持不变时,也不是一个状态 

在使用state的时候, 如果我们企图直接修改state中的某一个值之后直接打印(使用)他,就会发现,他其实并没有改变。

  就像下面的例子,企图通过点击事件之后就使用修改之后的state的值,但是会发state中的并没有被立即修改,还是原先的值,我们都知道那是因为     setState就相当于是一个异步操作,不能立即被修改

解决办法:

1、放在回调中,接受2个参数

2、操作异步函数,async / await 

在使用setState的时候,有两种格式;

     第一种setstate()格式  第一个参数是一个对象,第二个参数是一个回调函数,这个回调函数是在setstate执行完并页面渲染了之后再执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值