今天,当他在山顶上大喊“边界”时,Echo回到我身上“ React”或“ Angular”。我决定选择第一个(剧情曲折,是在艺术标题中);并开始从头开始学习。
YaSabãaJavaScript
我必须澄清此细节,因为许多阅读我的文章的人现在正在进入系统世界。请记住,我已经有14年的时间了,这给了我足够的时间旅行一些小语言。
JavaScript和TypeScript是使用React的卓越编程语言,第二个是(我认为)推荐的更多。
这使我能够显着减少React中的学习曲线。如果JS编程了,我告诉您,了解Asynchrona并承诺在这本小册子中占很重要。
React是一本小册子,而不是框架
他们会在许多课程中听这句话,但是很少有人需要正确的时间来解释它:与Angular(一个复杂的框架)不同,React是一本附上我们项目的小册子。
这意味着它的结构是我们的责任:在一个框架中,我们已经有了指南和规则,以避免不良实际。但是,只要我们负责将其包括在项目的生态系统中,图书馆就不仅仅是一组促进生活的功能。
React将使您能够重复使用组件,并伴随着生命周期和层次结构。这很棒,并为您提供了必须在项目中控制的自由,以获得最大的潜力。
我们开始做吧
ybeing un tutorial de Fazt,Armâ©a todolist,他使用了如此多的反应,如djago(y Dr.)。
首先组装一个包括我的“任务”应用程序的项目,其中包括以下模型:
from django.db import models
class Task(models.Model):
title = models.CharField(max_length=200)
description = models.TextField(blank=True)
done = models.BooleanField(default=False)
def __str__(self) -> str:
return self.title
然后为此模型编写序列化器:
from rest_framework import serializers
from .models import Task
class TaskSerializer(serializers.ModelSerializer):
class Meta:
model = Task
fields = '__all__'
现在在views.py上,放置视图:
from rest_framework import viewsets
from .serializers import TaskSerializer
from .models import Task
class TaskView(viewsets.ModelViewSet):
serializer_class = TaskSerializer
queryset = Task.objects.all()
modelViewSet 为我提供了所有最多的典型crud:get,post,put,put,patch,delete。现在我只需要映射网址:
from django.urls import path, include
from .views import TaskView
from rest_framework import routers
from rest_framework.documentation import include_docs_urls
router = routers.DefaultRouter()
router.register(f'tasks', TaskView, 'tasks')
urlpatterns = [
path('api/v1/', include(router.urls)),
path('docs/', include_docs_urls(title="Tasks API")),
]
一方面,组装对象路由器,这将帮助我映射我的视图集的世界。然后还包括 include_docs_urls ,它生成了非常功能的API文档样式。
我还必须为CORS添加一个方向,这是我的应用程序中我应用的来源:
CORS_ALLOWED_ORIGINS = [
'http://127.0.0.1:5173'
]
是反应时间!
随着API的运行,只剩下边框。 React和Django之间没有这样的组合,但是我可以在项目中构建一个 client 文件夹,尽管该文件夹是分开的,但可以满足其与API进行交互的功能。
此时,他采取了除了实施FAZT以外的几个快捷方式,因此我决定构建完整的API文件:
import axios from 'axios'
const taskApi = axios.create({
baseURL: 'http://localhost:8000/tasks/api/v1/tasks/'
})
export const getAllTasks = () => taskApi.get('/')
export const getTask = (id) => taskApi.get(`/${id}/`)
export const createTask = (task) => taskApi.post('/', task)
export const deleteTask = (id) => taskApi.delete(`/${id}`)
export const updateTask = (id, task) => taskApi.put(`/${id}/`, task)
林戈
原则上定义了 browserrouter ,它导致使用某些组件的不同页面 :
function App() {
return (
<BrowserRouter>
<div className="container mx-auto">
<Navigation />
<Routes>
<Route path="/" element={<Navigate to="/tasks" />} />
<Route path="/tasks" element={<TasksPage />} />
<Route path="/tasks-create" element={<TaskFormPage />} />
<Route path="/tasks/:id" element={<TaskFormPage />} />
</Routes>
</div>
<Toaster />
</BrowserRouter>
);
}
他们会看到一个罕见的CSS课程,这是因为我正在使用Tailwind进行样式。
在当前顺序中,路线为:
- /:重定向A/任务。
- /任务:显示现有任务的列表
- /tasks-reate:创建新任务的表格
- /task/ð带有加载任务的表格。
这最后的路由既用于编辑任务并消除任务。
显示任务的流程
我们知道,为了显示可视化所有任务的página,我们使用任务page组件:
<Route path="/tasks" element={<TasksPage />} />
是组件rhetora tasklist:
export function TaskList() {
const [tasks, setTasks] = useState([])
useEffect(() => {
async function loadTasks() {
const res = await getAllTasks()
setTasks(res.data)
}
loadTasks()
}, [])
return <div className="grid grid-cols-3 gap-3">
{tasks.map(task => (
<TaskCard key={task.id} task={task} />
))}
</div>
}
通过使用效率,该效率将在创建组件后立即执行,我们调用 getallTasks()(django api)异步,然后通过 tasks显示每个任务。地图< /em>,它将在TaskCard中渲染此类信息。< /p>
通过这种方式,我们实现了干净和流畅的通信,因为我们的API像其他任何人一样工作,并且根据需要它们的组件而将其最佳称为它们。
我已经走了季节(我继续从椅子上站起来),这是两个世界的神圣联盟(我举起胳膊,看听众)。
结论
我希望您喜欢我写这篇文章,并在下一篇文章中见到您!