Preact X 的最新消息
Preact X 是 Preact 8.x 的一大進步。我們重新思考了我們的程式碼的每一個位元和位元組,並在此過程中加入了許多主要功能。對於支援更多第三方函式庫的相容性增強也是如此。
簡而言之,Preact X 就是我們一直希望 Preact 成為的樣子:一個小巧、快速且功能豐富的函式庫。說到大小,你會很樂意聽到,所有新功能和改進的渲染都與 8.x
具有相同的大小!
片段
片段
是 Preact X 的主要新功能,也是重新思考 Preact 架構的主要動機之一。它們是一種特殊類型的元件,可將子元素與其父元素內聯渲染,而無需額外的包裝 DOM 元素。最重要的是,它們允許你從 render
傳回多個節點。
function Foo() {
return (
<>
<div>A</div>
<div>B</div>
</>
)
}
在 REPL 中執行componentDidCatch
我們都希望錯誤不會發生在我們的應用程式中,但有時它們確實會發生。使用 componentDidCatch
,現在可以捕捉和處理在生命週期方法(例如 render
)中發生的任何錯誤,包括元件樹深處的例外。這可用於顯示使用者友善的錯誤訊息,或在發生問題時將日誌項目寫入外部服務。
class Catcher extends Component {
state = { errored: false }
componentDidCatch(error) {
this.setState({ errored: true });
}
render(props, state) {
if (state.errored) {
return <p>Something went badly wrong</p>;
}
return props.children;
}
}
在 REPL 中執行Hooks
Hooks
是一種新的方式,可以更輕鬆地在元件之間共用邏輯。它們代表了現有基於類別的元件 API 的替代方案。在 Preact 中,它們存在於可透過 preact/hooks
匯入的附加元件中
function Counter() {
const [value, setValue] = useState(0);
const increment = useCallback(() => setValue(value + 1), [value]);
return (
<div>
Counter: {value}
<button onClick={increment}>Increment</button>
</div>
);
}
在 REPL 中執行createContext
createContext
-API 是 getChildContext()
的真正繼任者。雖然當你絕對確定永遠不會變更值時,getChildContext
很好用,但只要提供者和消費者之間的元件透過傳回 false
來封鎖更新時,shouldComponentUpdate
,它就會失效。有了新的內容 API,這個問題現在已經成為過去。這是一個真正的 pub/sub 解决方案,可以將更新傳遞到樹的深處。
const Theme = createContext('light');
function ThemedButton(props) {
return (
<Theme.Consumer>
{theme => <div>Active theme: {theme}</div>}
</Theme.Consumer>
);
}
function App() {
return (
<Theme.Provider value="dark">
<SomeComponent>
<ThemedButton />
</SomeComponent>
</Theme.Provider>
);
}
CSS 自訂屬性
有時,小事可以產生巨大的影響。有了 CSS 的最新進展,你可以利用 CSS 變數 進行樣式設定
function Foo(props) {
return <div style={{ '--theme-color': 'blue' }}>{props.children}</div>;
}
相容性核心
儘管我們一直熱衷於新增新功能並推動 Preact 的進步,但 preact-compat
套件並未獲得那麼多的關注。到目前為止,它一直存在於一個獨立的儲存庫中,這使得協調跨 Preact 和相容性層的大型變更變得更加困難。透過將相容性移至與 Preact 本身相同的套件中,無需額外安裝即可使用 React 生態系統中的函式庫。
相容性層現在稱為 preact/compat,並學會了許多新技巧,例如 forwardRef
、memo
和無數的相容性改進。
// Preact 8.x
import React from "preact-compat";
// Preact X
import React from "preact/compat";
許多相容性修正
這些修正太多,無法一一列出,但我們在與 React 生態系統的函式庫相容性方面已大幅進步。我們特別確保在我們的測試過程中包含幾個熱門套件,以確保我們可以保證對它們提供完全支援。
如果你遇到一個與 Preact 8 不相容的函式庫,你應該再試一次 X。一切都按預期運作的機率很高 ;)