React学习笔记(3)
请关注 sui 前端共学营及其社区,在这里你可以学到前端和 move 合约语言的知识。-
这里先给出一个简单的对count
进行加减的功能
import { useState } from'react';
function App() {
const [count, setCount] = useState(0);
const handleIncrement = () => { setCount(count + 1); };
const handleDecrement = () => { setCount(count - 1); };
return (
<div>
<button onClick={handleDecrement}>-</button>
<span>{count}</span>
<button onClick={handleIncrement}>+</button>
</div>
);
}
export default App;
我们可以看到这里的功能非常单一,只有加和减,如果我们希望对数据的更改方式可能是更加多样的,比如乘和除的话就不方便对数据做统一的管理。现在我们可以使用reduce
r使你的代码规范整洁。
定义一个函数countReducer
它接受state和action两个参数。state
表示当前reducer
函数要管理的那个状态,第二个action
表示你要对状态进行什么样的操作。下面通过switch
来判断action
的属性type
来进行相应操作,除了原先的操作还可以使用其他方式比如我这里地抛出异常。
实际使用它就能把useState
删除了换成useReducer
,这边有两参数。第一个就是刚刚设置的reducer
函数countReducer
,第二个代表默认值这里设为0。useReducer
的返回值与useState
较为相似返回一个数组,第一个元素是他的当前状态值state
,第二个是进行状态修改的触发器dispatch。
接下来就可以直接触发器dispatch
来进行相关操作后面带上参数type
。
import { useReducer, useState } from'react';
function countReducer(state, action) {
switch (action.type) {
case 'increment':
return state + 1;
case 'decrement':
return state - 1;
default:
throw new Error()
}
}
function App() {
const [state, dispatch] = useReducer(countReducer, 0)
const handleIncrement = () => dispatch({ type: 'increment' });
const handleDecrement = () => dispatch({ type: 'decrement' });
return (
<div>
<button onClick={handleDecrement}>-</button>
<span>{state}</span>
<button onClick={handleIncrement}>+</button>
</div>
);
}
export default App;
现在我们有一个计数器点击加号就会加一,如果我们要记忆上个数值的话就可以使用useRef
来进行创建数据存储的容器。
这个上一次的值prevCount
有几个特点,它的值可以手动修改但并不是一个相应是状态并且不会随着组件的更新而进行重新的更新。
还有它的值进行设定是并不是给值本身做设置,而是通过调用useRef
返回一个包含current
属性的对象,所以操作是给current
来做一个值的设定。
function App() {
const [count, setCount] = useState(0);
const prevCount = useRef(count);
function handleClick() {
prevCount.current = count;
setCount(count + 1);
}
return (
<div>
<p>最新count:{count}</p>
<p>上一次count:{prevCount.current}</p>
<button onClick={handleClick}>+</button>
</div>
);
}
我们在使用useRef
除了可以引用之前的状态值外话可以来引用页面中的标签。
子默认不对外开放内部功能,如果我们希望设置一个方法能被父组件使用的话,就需要一下特殊处理,首先子组件不能直接定义为一个普通函数,而是要通过const
的函数表达方式来做定义,并且要通过React的方法forwardRef
来处理这样才可以被父组件使用,这时我们的子组件还需要接受我们外部的ref
。
const Child = forwardRef(function(props, ref) {
return (
<div>子组件</div>
)
})
function App() {
const childrRef = useRef();
function handleClick() {
}
return (
<div>
<Child ref={childrRef}/>
<button onClick={handleClick}>按钮</button>
</div>
);
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!