ReactNative Hook

1 Hook是什么

Hook可以在不使用class的情况下在函数组件中使用React的特性。

2 useState

useState 就是一个 Hook ,useState 用于在函数组件中添加内部 state。

// 函数组件
import React, { useState } from 'react';

const demo = () => {
  const [text, setText] = useState('啊');
  
  return (
    <div onClick={() => { setText('哈'); }}>
      <p>{text}</p>
    </div>
  )
}
// 同等于class

代码中申明了变量 text,默认值为 ,可以通过 setText 来改变它的值。

3 useEffect

useEffect 可以在函数组件中达到生命周期函数的作用,可以把它看作componentDidMount,componentDidUpdate 和 componentWillUnmount 这三个函数的组合。

import React, { useState, useEffect } from 'react';

const demo = () => {
  const [text, setText] = useState('啊');

  useEffect(() => {
    setText('咦');
  })

  return (
    <div onClick={() => { setText('哈'); }}>
      <p>{text}</p>
    </div>
  )
}

useEffect会在每次渲染后都执行,如果只想在某个或某些变量发生更改时执行,只需在useEffect中传递第二个参数 [变量名]。

import React, { useState, useEffect } from 'react';

const demo = () => {
  const [text, setText] = useState('啊');
  const [text2, setText2] = useState('啊');
  const [text3, setText3] = useState('啊');

  useEffect(() => {
    setText('咦');
  },[text, text2])

  return (
    <div onClick={() => { setText('哈'); }}>
      <p>{text}</p>
    </div>
  )
}

如上,这样useEffect只会在text和text2发生改变时执行,text3发生改变时不执行。

注意:如果第二个参数传递的为空数组,那么它只会在组件挂在和卸载的时候执行。

如果组件卸载时需要清除,那么直需要返回一个清除函数,效果同class组件中的componentWillUnmount。

import React, { useState, useEffect } from 'react';

const demo = () => {
  const [text, setText] = useState('啊');
  const [text2, setText2] = useState('啊');
  const [text3, setText3] = useState('啊');

  useEffect(() => {
    setText('咦');
    return () => {
    	// 清除函数 用于组件卸载时做清除操作
    }
  },[text, text2])

  return (
    <div onClick={() => { setText('哈'); }}>
      <p>{text}</p>
    </div>
  )
}

在一个函数组件中useEffect可以写多个

import React, { useState, useEffect } from 'react';

const demo = () => {
  const [text, setText] = useState('啊');
  const [text2, setText2] = useState('啊');
  const [text3, setText3] = useState('啊');

  useEffect(() => {
    setText('咦');
    return () => {
    	// 清除函数 用于组件卸载时做清除操作
    }
  },[text, text2])
  
  useEffect(() => {},[text])

  return (
    <div onClick={() => { setText('哈'); }}>
      <p>{text}</p>
    </div>
  )
}

4 自定义Hook

通过自定义 Hook,可以将组件逻辑提取到可重用的函数中。
通过自定义 Hook,名称必须用use开头。

import React, { useState, useEffect } from 'react';

const useCommon = (text) => {
  const [val, setVal] = useState(false);
  useEffect(() => {
    if (val) {
      setVal(true)
    }
  })
  return val
}

const demo = () => {
  const text = useCommon('啊');

  return (
    <div>
      <p>{text}</p>
    </div>
  )
}

const demo2 = () => {
  const text = useCommon('哈');

  return (
    <div>
      <p>{text}</p>
    </div>
  )
}

5 获取redux数据 useSelector

import { useSelector } from 'react-redux';
export default () => {
  const user = useSelector((state) => state.user);
};

6 获取redux的dispatch useDispatch

import { useDispatch } from 'react-redux';
export default () => {
  const dispatch = useDispatch();
};

7 获取navigation对象 useNavigation

import { useNavigation } from '@react-navigation/native';
export default () => {
  const navigation = useNavigation();
};

8 使用ref useRef

import React, { useRef } from 'react';
import { View } from 'react-native';
export default () => {
  const refView = useRef();
  return (
  	<View ref={refView }></View>
  );
};

9 子组件暴露方法给父组件 forwardRef useImperativeHandle

// 子组件
import React, { useState, forwardRef, useImperativeHandle } from 'react';
import { View } from 'react-native';
export default forwardRef(({}, ref) => {
  	const [val, setVal] = useState('');
  	// 暴露方法给父组件
	useImperativeHandle(ref, () => {
	  return {
	     _setVal(v) {
	       setVal(v);
	     },
	   };
	 });
});

// 父组件
import React, { useRef } from 'react';
import { View } from 'react-native';
export default () => {
  const refView = useRef();
  refView.current._setVal('val');
  return (
  	<ChildComponents ref={refView } />
  );
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴佩佩佩佩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值