【SolidJs】仅次于原生JS的超级性能!SolidJs框架教程【中】

简介: Children在SolidJs中,如果在组件中写一些children,并非仅仅作为展示,而需要在子组件中处理children时,需要用到children函数。

Props

Children

在SolidJs中,如果在组件中写一些children,并非仅仅作为展示,而需要在子组件中处理children时,需要用到children函数。

举个🌰

main.tsx

import { render } from "solid-js/web";
import { createSignal, For } from "solid-js";
import ColoredList from "./colored-list";
function App() {
  const [color, setColor] = createSignal("red");
  const [persons] = createSignal(["Alice", "Bob", "Jack"])
  return <>
    <ColoredList color={color()}>
      <For each={persons()}>{item => <div style={{color: color()}}>{item}</div>}</For>
    </ColoredList>
    <button onClick={() => setColor("green")}>Set Color</button>
  </>;
}
render(() => <App />, document.getElementById('app'));
复制代码

color-list.tsx

import { createEffect, children } from 'solid-js'
export default function ColorList(props) {
    const c = children(() => props.children) // 处理children
    createEffect(() => c().forEach(item => item.style.color = props.color)) // 监听props.color并修改children的颜色
    return <>{c()}</>
}
复制代码

Store

创建Store

import { render } from "solid-js/web";
import { createStore } from "solid-js/store";
const App = () => {
  const [store, setStore] = createStore({ username: "Alice" });
  console.log("store -----> ", store); // "store -----> " {"username": "Alice"}
  const toggleUsername = (username) => {
    console.log(username);
    setStore("username", (name) => {
      console.log("store.name ----->", name); // "store.name ----->" "Alice"
      return username;
    });
  };
  return (
    <>
      <div>{store.username}</div>
      <button onClick={[toggleUsername, "bob"]}>setStore username</button>
    </>
  );
};
render(App, document.getElementById("app"));
复制代码

修改Store

修改Store有一个修饰符produce,需要吧上面的🌰改成这样修改:

const toggleUsername = (username) => {
    setStore(
        'username',
        produce((name) => username)
    )
}
复制代码

produce的作用是小范围修改值

它可以让你在 setStore 调用中改变 Store 对象的可写代理版本

Context

Context API 用来传递数据,不依赖Props,多用于组件间的数据共享,食用方法一般为,创建一个Context对象,该对象包含一个用于注入数据的Provider组件,举个计数器的🌰:

main.tsx

import { render } from 'solid-js/web'
import Nested from './nested'
import { CounterProvider } from './counter'
function App() {
    return <>
        <h1>Welcome</h1>
        <Nested />
    </>
}
render(() => {
    <CounterProvider count={1}> <App /> </CounterProvider>,
    document.getElementById('app')
})
复制代码

nested.tsx

import { useCounter } from './counter.tsx'
const [count, {invrement,decrement}] = useCounter()
export default function Nested() {
    return (
        <>
            <div>0</div>
            <button>+</button>
            <button>-</button>
        </>
    )
}
复制代码

counter.tsx

import { createSignal, createContext, useContext } from 'solid-js'
const CounterContext = createContext()
export function CounterProvider(props) {
    const [count, setCount] = createSignal(props.count || 0),
          store = [
              count,
              {
                  invrement() { setCount(c => c + 1) },
                  decrement() { setCount(c => c - 1) }
              },
          ]
    return (
        <CounterContext.Provider value={store}>{props.children}</CounterContext.Provider>
    )
}
export function useCounter() { return useCountext(CounterContext)}
复制代码

懒加载组件

举个🌰

main.tsx

import { render } from "solid-js/web";
import { lazy } from "solid-js";
const Greeting = lazy(() => import("./greeting"))
function App() {
  return (
    <>
      <h1>Welcome</h1>
      <Greeting name="Jake" />
    </>
  );
}
render(() => <App />, document.getElementById("app"));


目录
相关文章
|
1天前
|
JavaScript 前端开发 Java
node.js环境安装以及Vue-CLI脚手架搭建项目教程
node.js环境安装以及Vue-CLI脚手架搭建项目教程
|
4天前
|
前端开发 JavaScript 容器
程序技术好文:纯原生javascript下拉框表单美化实例教程
程序技术好文:纯原生javascript下拉框表单美化实例教程
|
5天前
|
缓存 JavaScript 前端开发
Vue.js框架在构建单页面应用中的最佳实践
Vue.js最佳实践包括组件化(如单一职责组件)、使用Vuex管理状态、axios处理异步请求、Vue Router进行路由、优化性能(keep-alive及懒加载)和选择UI库配合模块化样式。通过这些方法,开发者能构建高效、可维护的SPA。【6月更文挑战第25天】
12 1
|
5天前
|
JavaScript 前端开发
事件委托是JS技巧,通过绑定事件到父元素利用事件冒泡,减少事件处理器数量,提高性能和节省内存。
【6月更文挑战第27天】事件委托是JS技巧,通过绑定事件到父元素利用事件冒泡,减少事件处理器数量,提高性能和节省内存。例如,动态列表可共享一个`click`事件处理器,通过`event.target`识别触发事件的子元素,简化管理和响应动态内容变化。
7 0
|
12天前
|
JavaScript 前端开发 安全
安全开发-JS应用&原生开发&JQuery库&Ajax技术&加密编码库&断点调试&逆向分析&元素属性操作
安全开发-JS应用&原生开发&JQuery库&Ajax技术&加密编码库&断点调试&逆向分析&元素属性操作
|
13天前
|
JavaScript 前端开发 Java
信息打点-JS架构&框架识别&泄漏提取&API接口枚举&FUZZ&插件项目
信息打点-JS架构&框架识别&泄漏提取&API接口枚举&FUZZ&插件项目
|
14天前
|
移动开发 JavaScript 前端开发
原生js如何获取dom元素的自定义属性
原生js如何获取dom元素的自定义属性
17 0
|
14天前
|
JavaScript 前端开发
原生JS如何查询元素属性
原生JS如何查询元素属性
12 0
|
15天前
|
JSON JavaScript 中间件
Node.js Express 框架
Node.js Express 框架
13 0