体系课-大数据工程师2023版完结[2023最新版]
download:https://97yrbl.com/t-1715.html
初始化一个项目
启动一个新的React项目有很多种办法,其中一种办法是运用create-react-app:
npx create-react-app my-app
cd my-app
npm start
在Swift中,您运用Xcode创立一个新的SwiftUI项目:
翻开 Xcode
选择“Create a new Xcode project”
选择iOS(或macOS或多平台)后,选择 “App”,并在 “interface” 选项当选择SwiftUI。
构造化组件
组件是应用程序 UI 的构建模块。
在React中,组件通常是返回一些JSX的函数。
const Greeting = () => <h1>Hello, world!</h1>;
在SwiftUI中,组件被称为Views(视图)。您能够将它们定义为契合 View 协议的 structures(构造)。
struct Greeting: View {
var body: some View {
Text("Hello, world!")
}
}
捕获表单输入
处置用户输入是任何应用程序的常见形式。
ReactJS
在 React 中,您可能会创立一个输入字段,并运用 useState 钩子来跟踪其值。
const InputComponent = () => {
const [inputValue, setInputValue] = useState("");
const handleChange = event => setInputValue(event.target.value);
return <input type="text" value={inputValue} onChange={handleChange} />;
};
SwiftUI
SwiftUI简化了这一过程。经过运用 @State 属性包装器并将其绑定到input,SwiftUI 将为您处置同步。
struct InputView: View {
@State private var inputValue = ""
var body: some View {
TextField("Enter text", text: $inputValue)
.padding()
}
}
运用 State 状态
状态关于响应式用户界面是必不可少的。
ReactJS
在React中,我们经常运用 useState 钩子来管理组件级状态。
const Counter = () => {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + 1)}>
Clicked {count} times
</button>
);
};
SwiftUI
相似地,在SwiftUI中,我们运用 @State 属性包装器来跟踪视图中的本地状态。
struct CounterView: View {
@State private var count = 0
var body: some View {
Button("Clicked \(count) times") {
count += 1
}
.padding()
}
}
将回调传送给子组件
在父子通讯中,将函数作为 props 传送是很常见的。
ReactJS
在React中,你能够经过子组件能够调用的 props 将函数传送给子组件。
const Parent = () => {
const handleAction = () => console.log("Action handled");
return <Child onAction={handleAction} />;
};
const Child = ({ onAction }) => <button onClick={onAction}>Do Action</button>;
SwiftUI
在SwiftUI中,经过将闭包传送给子视图也能够完成同样的效果。
struct ParentView: View {
var body: some View {
ChildView(onAction: { print("Action handled") })
}
}
struct ChildView: View {
let onAction: () -> Void
var body: some View {
Button("Do Action", action: onAction)
}
}
在应用程序中共享数据
ReactJS (运用 Context):
在React中,Context API是共享状态和将状态传送到组件树深处的常用选择,而无需手动传送props。
const AppContext = createContext();
const Parent = () => (
<AppContext.Provider value={{ message: "Hello from context" }}>
<Child />
</AppContext.Provider>
);
const Child = () => {
const context = useContext(AppContext);
return <div>{context.message}</div>;
};
SwiftUI (运用 EnvironmentObject):
SwiftUI提供EnvironmentObject,允许视图共享一个共同的数据源。
class AppData: ObservableObject {
@Published var message = "Hello from environment object"
}
struct ParentView: View {
var body: some View {
ChildView().environmentObject(AppData())
}
}
struct ChildView: View {
@EnvironmentObject var appData: AppData
var body: some View {
Text(appData.message)
}
}
处置 Effects 反作用
对变化做出反响关于任何现代UI框架来说都是至关重要的。
ReactJS (运用 useEffect):
在React中,useEffect 钩子允许您在函数组件中执行反作用。
const MyComponent = () => {
useEffect(() => {
console.log("Component mounted");
return () => console.log("Component unmounted");
}, []);
return <div>Hello, World!</div>;
};
SwiftUI (运用 onAppear 和 onDisappear):
SwiftUI提供了onAppear和onDisappear修饰符,它们能够附加到视图中以完成相似的功用。
struct MyView: View {
var body: some View {
Text("Hello, World!")
.onAppear {
print("View appeared")
}
.onDisappear {
print("View disappeared")
}
}
}
附带阐明一下,在视图初次渲染时调用异步函数,运用 .task 修饰符可能比运用 .onAppear 更好。假如视图在任务完成前已被销毁,任务将自动取消。
路由和导航
导航是任何应用程序的根底。
ReactJS (运用 React Router)
在React中,React Router通常用于导航。
import { BrowserRouter as Router, Route, Link } from "react-router-dom";
const Navigation = () => (
<Router>
<div>
<nav>
<ul>
<li><Link to="/">Home</Link></li>
</ul>
</nav>
<Route path="/" exact component={Home} />
</div>
</Router>
);
SwiftUI (运用 NavigationView 和 NavigationLink)
SwiftUI提供了NavigationView和NavigationLink来创立导航接口。
struct NavigationExampleView: View {
var body: some View {
NavigationView {
NavigationLink(destination: HomeView()) {
Text("Home")
}
}
}
}
总结
SwiftUI带来了一种声明式的UI构建方式,相似于ReactJS,但与Swift集成得更严密。
理解ReactJS和SwiftUI之间的这些映射能够使两者之间的过渡愈加直观。固然这触及到一个学习曲线,但理解形式的异同能够使这一过程愈加顺利。
请记住,SwiftUI正在疾速开展,因而请及时理解最新的更改和功用。
当您准备好运用HTTP恳求并将应用程序衔接到远程API时,请查看 "从JavaScript过渡到Swift和SwiftUI?从这个简单的网络层开端"。