JSX中,用 {} 大括号包裹javascript代码。使用 { { } } 内联css。
JSX注释实用:{/* */}
。
JSX 中所有 HTML 属性和事件引用的命名约定都变成了驼峰式。JSX中HTML标签的id,实用className。
1 | //将JSXName渲染到id为idName的节点中 |
map
1 | ['abc','efg','hij'].map((item, index) => |
组件基础
1 | const MyComponent = function() { |
Hook
import React, { useState, useEffect } from 'react';
function Example(){
//count是一个state,setCount代表更新count的函数,0则是初始化值
const [count,setCount] = useState(0);
const [timer,setTimer] = useState(null);
useEffect(()=>{
//第一次渲染和每次刷新后都会执行
//[count]可以不传。传入后会对比count的值,不同才执行
},[count]);
return(
<div>
<p>You clicked {count} times</p>
<button onClick={()=>setCount(count+1)}>click me</button>
</div>
);
}
自定义Hook
import React, { useState, useEffect } from 'react';
//自定义hook
function useFriendStatus( friendID ) {
const [isOnline, setIsOnline] = useState(null);
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
//绑定监听,ChatAPI会调用handleStatusChange方法设置是否在线
ChatAPI.subscribeToFriendStatus(friendID,handleStatusChange);
//销毁时调用取消监听
return ()=> {
ChatAPI.unsubscribeToFriendStatus(friendID,handleStatusChange);
}
});
return isOnline;
}
使用上述自定义的useFriendStatus:
function FriendItem(id) {
const isOnline = userFriendStatus(id);
return (
<li style={{ color: isOnlie? 'green':'black'}}>
id: {id}
</li>
);
}
不同组件中使用相同的自定义Hook并不会共享State(即useState()函数的返回值),它们都是独立的,并且在同一个组件中每次调用Hook都会获取独立的State
useContext hook获取全局属性
const themes = {
light: {
foreground: "#000000",
},
drak: {
foreground: "#ffffff",
},
};
const ThemeContext = React.createContext(themes.light);
function ThemedButton() {
//useContext的参数是React.createContext出来的context
const theme = useContext(ThemeContext);
return (
<button style={{ color:theme.foreground}}>按钮</button>
);
}
其他Hook: useReducer(), useCallback(), useMemo(), useImperativeHandle(), useLayoutEffect(), useDebugValue(), 等等