Двойные фестивальные туристы как горы, лучше кодировать дома. Применяйте полученные знания, меньше работайте сверхурочно и играйте дома во славу короля.
использую в повседневной работеVue
,заReact
Это только простое понимание, и никакого глубокого изучения не проводилось. Воспользовавшись этим двойным отпуском, редактор решил усердно учитьсяReact
, сегодняшняя статья - это то, что изучает редакторReact
После этогоReact
иVue
Сравнение использования , через это сравнение удобно использоватьVue
друзья могут быстроVue
Обозначение в преобразуется вReact
письма.
Эта статья была впервые опубликована в общедоступном аккаунте [Некоторые люди играют на фронтенде], играют на фронтенде, собеседование на работу, просто на [Некоторые люди играют на фронтенде]
слот вReact
не нашел в? ?
в настоящее время используетVue
При вызове компонента особенно часто используется функция слота.Определив слот, внешнее содержимое может быть передано в компонент при вызове компонента и отображено в указанной позиции. существуетVue
, слоты делятся на слоты по умолчанию, именованные слоты и слоты с областью действия. На самом деле не толькоVue
,существуетReact
На самом деле есть еще функция похожая на слот, но по названию слот не называется, ниже проиллюстрирую на примере.
слот по умолчанию
Теперь проекту необходимо разработать компонент карты. Как показано на рисунке ниже, для карты можно указать заголовок, а затем пользователь может настроить содержимое карты. В настоящее время для содержимого карты это может быть реализовано с помощью с помощью слота, и мы будем использовать его отдельно ниже.Vue
иReact
для достижения этой функции
Vue
выполнить
-
Сначала реализуйте
card
компонент, как показано в следующем коде<template> <div class="card"> <div class="card__title"> <span>{{ title }}</span> </div> <div class="card__body"> <slot></slot> </div> </div> </template> <script> export default { props: { title: { type: String, default: '' } } } </script>
Как вы можете видеть выше, мы использовали
<slot></slot>
, это слот компонента по умолчанию.При использовании компонента входящий контент будет помещаться в<slot></slot>
место расположения -
использование определено извне
card
компоненты<template> <div> <my-card> <div>我将被放在card组件的默认插槽里面</div> </my-card> </div> </template> <script> import MyCard from '../components/card' export default { components: { MyCard } } </script>
С помощью приведенного выше кода вы можете использовать слот компонента по умолчанию для применения внешнего содержимого к указанной позиции в компоненте.
React
выполнить
Хотя вReact
Внутри нет понятия слотов, ноReact
внутрь тоже может пройтиprops.children
Получите дочерние элементы внутри тега компонента, как в приведенном выше коде.<my-card>
Дочерние элементы внутри тега, с помощью которых мы также можем добиться чего-то вродеVue
Функция слота по умолчанию, давайте посмотрим на код.
-
использовать
React
определениеCard
компонентыimport React from 'react' export interface CardProps { title: string, children: React.ReactNode } export default function(props: CardProps) { return ( <div className="card"> <div className="card__title"> <span>{props.title}</span> </div> <div className="card__body"> {/**每个组件都可以获取到 props.children。它包含组件的开始标签和结束标签之间的内容 */} {props.children} </div> </div> ); }
- использовать наружно
Card
компоненты
import React from 'react' import Card from './components/Card' export default function () { return ( <div> <Card title="标题"> <div>我将被放在card组件的body区域内容</div> </Card> </div> ); }
- использовать наружно
именованный слот
продолжить с вышеизложеннымCard
Возьмите компонент в качестве примера, если наши требования сейчас изменятся, компонентtitle
Также можно использовать слоты, на этот раз дляVue
вы можете использовать именованные слоты иReact
Есть также способ сделать это.
Реализация Vue
Vue
Именованный слот в основном решает сценарий, когда компоненту требуется несколько слотов, а его реализация предназначена для<slot>
Добавить кname
реализованы свойства.
- У нас есть вышеуказанные требования к
card
компоненты для модификации
<template>
<div class="card">
<div class="card__title">
<!--如果传入了title,则使用title属性,否则使用具名插槽-->
<span v-if="title">{{ title }}</span>
<slot v-else name="title"></slot>
</div>
<div class="card__body">
<!--对于内容区域依然使用默认插槽-->
<slot></slot>
</div>
</div>
</template>
<script>
export default {
props: {
title: {
type: String,
default: ''
}
}
}
</script>
-
card
После того, как компонент изменен, давайте настроим его для использованияcard
компонентное место
<template>
<div>
<my-card>
<!--通过v-slot:title 使用具名插槽-->
<template v-slot:title>
<span>这里是标题</span>
</template>
<div>我将被放在card组件的默认插槽里面</div>
</my-card>
</div>
</template>
<script>
import MyCard from '../components/card'
export default {
components: {
MyCard
}
}
</script>
Реагировать на реализацию
React
Сокетов нет, не говоря уже об именованных сокетах, но это не значит, что их нельзя смоделировать. заReact
изprops
, мы можем не только передать обычные атрибуты, но и передать функцию, то мы можем вернуться в переданной функцииJSX
, тем самым реализуя функцию именованного слота.
- к оригиналу
Card
компоненты для модификации
import React from 'react'
export interface CardProps {
title?: string,
// 加入了一个renderTitle属性,属性类型是Function
renderTitle?: Function,
children: React.ReactNode
}
export default function(props: CardProps) {
const {title, renderTitle} = props
// 如果指定了renderTtile,则使用renderTitle,否则使用默认的title
let titleEl = renderTitle ? renderTitle() : <span>{title}</span>
return (
<div className="card">
<div className="card__title">{titleEl}</div>
<div className="card__body">
{/**每个组件都可以获取到 props.children。它包含组件的开始标签和结束标签之间的内容 */}
{props.children}
</div>
</div>
);
}
- Затем вы можете настроить его внешне
title
охватывать
import React from 'react'
import Card from './components/Card'
export default function () {
return (
<div>
<Card renderTitle={
() => {
return <span>我是自定义的标题</span>
}
}>
<div>我将被放在card组件的body区域内容</div>
</Card>
</div>
);
}
слот с прицелом
Иногда бывает полезно иметь данные доступа к содержимому слота, которые доступны только в дочерних компонентах, этоVue
Причина предоставления слотов с ограниченной областью действия. Мы продолжаем использовать вышеперечисленное.Card
Возьмем компонент в качестве примера.Теперь я разработал компонент карточки с информацией о персонале на основе вышеуказанного компонента карточки.Пользователи могут напрямую использовать компонент карточки с информацией о персонале для отображения информации о персонале в интерфейсе.Однако в некоторых бизнес-модулях это необходимо для настройки способа отображения информации о персонале, здесь нам нужно использовать слоты с заданной областью действия.
Vue
выполнить
- Реализуйте компонент карты с информацией о пользователе, который использует слот области видимости.
<template>
<custom-card title="人员信息卡片">
<div class="content">
<!--这里使用了作用域插槽,将userInfo传出去了-->
<slot name="userInfo" :userInfo="userInfo">
<!--如果没有使用插槽,则显示默认内容-->
<span>姓名: {{ userInfo.name }}</span>
<span>性别: {{ userInfo.sex }}</span>
<span>年龄: {{ userInfo.age }}</span>
</slot>
</div>
</custom-card>
</template>
<script>
import CustomCard from '../card'
export default {
components: {
CustomCard
},
data() {
return {
userInfo: {
name: '张三',
sex: '男',
age: 25
}
}
}
}
</script>
- Внешнее использование компонента информации о людях
<template>
<div>
<user-card>
<template v-slot:userInfo="{ userInfo }">
<div class="custom-user">
<ul>
<li>姓名: {{ userInfo.name }}</li>
<li>年龄: {{ userInfo.age }}</li>
</ul>
</div>
</template>
</user-card>
</div>
</template>
<script>
import UserCard from '../components/user-card'
export default {
components: {
UserCard
}
}
</script>
React
выполнить
В секции named slots мы передали функцию компоненту, а затем вернули в функцииJSX
Способ симулировать именованный слот, затем для слота прицела, мы все еще можем использовать метод функции, а параметры, передаваемые слотом прицела, можно заменить методом передачи параметров в функцию
-
Внедрение компонента карточки с информацией о персонале
import React, { useState } from 'react' import Card from './Card' interface UserCardProps { renderUserInfo?: Function } export interface UserInfo { name: string; age: number; sex: string; } export default function(props: UserCardProps) { const [userInfo] = useState<UserInfo>({ name: "张三", age: 25, sex: "男", }); const content = props.renderUserInfo ? ( props.renderUserInfo(userInfo) ) : ( <div> <span>姓名: {userInfo.name}</span> <span>年龄: {userInfo.age}</span> <span>性别: {userInfo.sex}</span> </div> ); return <Card title="人员信息"> {content} </Card> }
-
Внешнее использование компонента People Card
import React from 'react' import UserCard, { UserInfo } from "./components/UserCard"; export default function () { return ( <div> <UserCard renderUserInfo={(userInfo: UserInfo) => { return ( <ul> <li>姓名: {userInfo.name}</li> </ul> ); }} ></UserCard> </div> ); }
Context
, React
серединаprovide/inject
Обычно при разработке проекта для управления состоянием между несколькими компонентами, вVue
будет использоваться вVuex
,существуетReact
будет использоваться вredux
илиMobx
, Но для небольших проектов использование этих библиотек управления состоянием является излишним, так как же завершить управление данными без использования этих библиотек? Например, наиболее часто задаваемый компонент общения внуков в интервью. существуетVue
в мы можем использоватьprovide/inject
,существуетReact
в мы можем использоватьContext
.
Предположим, есть такой сценарий, теперь в системе нужно предоставить функцию скина, пользователь может переключать скины, и теперь мы используемVue
иReact
для достижения этой функции.
Vue
серединаprovide/inject
существуетVue
в мы можем использоватьprovide/inject
Чтобы добиться переноса стоимости между многоуровневыми компонентами, взяв в качестве примера вышеприведенный сценарий, мы используемprovide/inject
для достижения следующего
Во-первых, изменитьApp.vue
Содержание следующее
<template>
<div id="app">
<router-view />
</div>
</template>
<script>
export default {
data() {
return {
themeInfo: {
theme: 'dark'
}
}
},
provide() {
return {
theme: this.themeInfo
}
}
}
</script>
Затем на любом уровне дочерних компонентов используйте, как показано ниже
<template>
<div :class="`child-${theme.theme}`">
</div>
</template>
<script>
export default {
inject: ['theme']
}
</script>
так что это может быть достигнутоtheme
общий для всех дочерних компонентов
React
серединаContext
существуетVue
в мы используемprovide/inject
Реализована функция межуровневой передачи значения компонента, вReact
Аналогичная функция предусмотрена и вContext
, ниже мы используемContext
для достижения той же функции.
в проектеsrc
новый каталогcontext
каталог, добавитьMyContext.js
файл, затем добавьте следующее
import {createContext} from 'react'
// 定义 MyContext,指定默认的主题为`light`
export const MyContext = createContext({
theme: 'light'
})
MyContext
предоставилProvider
,пройти черезProvider
можетtheme
Общий для всех подкомпонентов. Теперь у нас есть общий родительский компонент во всех компонентах, напримерApp.js
добавить вышеMyContext.Provider
будетtheme
делить
import { MyContext } from '@/context/MyContext';
export default function() {
const [theme, setTheme] = useState('dark')
return (
<MyContext.Provider
value={{
theme
}}
>
<Children></Children>
</MyContext.Provider>
)
}
Затем вы можете использовать определенную тему непосредственно во всех подкомпонентах в это время.theme
охватывать
import React, { useContext } from 'react'
import { MyContext } from '@/context/MyContext';
export default function() {
const {theme} = useContext(MyContext)
return <div className={`child-${theme}`}>
}
никого не осталосьv-model
, но не влияет на использование
мы знаемReact
иVue
Все они представляют собой односторонний поток данных, то есть поток данных передается и обновляется от внешнего уровня к компонентам внутреннего уровня, например, в следующем абзаце.React
Код — это стандартный односторонний поток данных.
import React, { useState } from "react";
export default function(){
const [name] = useState('子君')
return <input value={name}></input>
}
существуетvue
используется вv-model
Как и в приведенном выше коде, мы проходим черезvalue
Свойства передают внешние значения вinput
компонента, это простой односторонний поток данных. но используяVue
Когда есть еще два особых синтаксических сахараv-model
и.sync
, эти два синтаксических сахара позволяютVue
Компоненты имеют возможности двусторонней привязки данных, например следующий код
<template>
<input v-model="name"/>
</template>
<script>
export default {
data() {
return {
name:'子君'
}
}
}
</script>
пройти черезv-model
, когда пользователь изменяетinput
ценность, внешнийname
Значение также будет изменено синхронно. но этоVue
синтаксический сахар дляReact
не поддерживается, поэтомуReact
Как я должен это делать? Теперь подумайте о настройкеv-model
,v-model
на самом деле по определениюvalue
Атрибут Одновременное прослушиваниеinput
события, такие как это:
<template>
<div class="custom-input">
<input :value="value" @input="$_handleChange"/>
</div>
</template>
<script>
export default {
props:{
value:{
type: String,
default: ''
}
},
methods:{
$_handleChange(e) {
this.$emit('input', e.target.value)
}
}
}
</script>
существуетreact
Искатьv-model
альтернативный план
Так же,React
Хотя нетv-model
Синтаксический сахар, но двусторонняя привязка данных также может быть достигнута путем передачи свойств и последующего прослушивания событий.
import React, { useState } from 'react'
export default function() {
const [name, setName] = useState('子君')
const handleChange = (e) => {
setName(e.target.value)
}
return <div>
<input value={name} onChange={handleChange}></input>
</div>
}
я только начал использоватьreact
, чувство нетv-model
Вроде хлопотнее, но беда есть беда, а переписывать код приходится. Как и в приведенном выше коде, каждый элемент формы должен слушатьonChange
Инцидент становится все более и более неприятным, в настоящее время вы можете рассмотреть несколькоonChange
События объединяются в одно, например следующий код
import React, { useState } from 'react'
export default function () {
const [name, setName] = useState('子君')
const [sex, setSex] = useState('男')
const handleChange = (e:any, method: Function) => {
method(e.target.value)
}
return <div>
<input value={name} onChange={(e) => handleChange(e, setName)}></input>
<input value={sex} onChange={(e) => handleChange(e, setSex)}></input>
</div>
}
Без инструкций я чувствую себя таким потерянным
существуетVue
На наших общих страницах рисования мы будем использоватьtemplate
,template
В нем содержится множество инструкций, которые помогут нам завершить развитие бизнеса, но вReact
используется вJSX
, а инструкции нет, так что же делать? Ниже мыVue
Некоторые из наиболее часто используемых инструкций вJSX
Синтаксис внутри (примечание: также работает в VueJSX
)
v-show
иv-if
существуетVue
В нашем скрытом элементе отображения мы можем использоватьv-show
илиv-if
, конечно, сценарии использования у них разные,v-show
установив элементdisplay
стили для отображения скрытых элементов, аv-if
Скрытие элемента — это прямое удаление элемента изdom
удалено из .
-
посмотри
Vue
серединаv-show
иv-if
использование<template> <div> <span v-show="showName">姓名:{{ name }}</span> <span v-if="showDept">{{ dept }}</span> </div> </template> <script> export default { data() { return { name: '子君', dept: '银河帝国', showName: false, showDept: true } } } </script>
-
будет
v-show
,v-if
преобразовать вJSX
грамматика всуществует
Vue
Инструкция в.template
Он существует для облегчения динамического манипулирования данными, но когда дело доходит доReact
В том, что мы пишем,JSX
, можно использовать напрямуюJS
, так что инструкция не обязательно должна существовать, то указанная вышеv-show
,v-if
какJSX
Китайская альтернативаimport React, { useState } from 'react' export default function() { const [showName] = useState(false) const [showDept] = useState(true) const [userInfo] = useState({ name:'子君', dept: '银河帝国' }) return ( <div> {/**模拟 v-show */} <span style={{display: showName ? 'block' : 'none'}}>{userInfo.name}</span> {/**模拟 v-if */} {showDept ? <span>{userInfo.dept}</span>: undefined} </div> ) }
v-for
v-for
существуетVue
используется для обхода данных, и мы используемv-for
Когда вам нужно указать элементkey
,key
Значение обычно представляет собой данныеid
или другое уникальное и фиксированное значение. не только вVue
в, вReact
также существует вkey
Да, обаkey
Смысл существования в принципе тот же, все для оптимизации виртуальногоDOM
diff
Алгоритмы существуют.
-
существует
Vue
используется вv-for
<template> <div> <ul> <li v-for="item in list" :key="item.id"> {{ item.name }} </li> </ul> </div> </template> <script> export default { data() { return { list: [ { id: 1, name: '子君' }, { id: '2', name: '张三' }, { id: '3', name: '李四' } ] } } } </script>
-
существует
React
используется вv-for
Альтернативный синтаксис длясуществует
react
Хотя нетv-for
,ноJSX
можно использовать непосредственно вJS
, так что мы можем пройти массив напрямуюimport React from 'react' export default function() { const data = [ { id: 1, name: "子君", }, { id: "2", name: "张三", }, { id: "3", name: "李四", }, ]; return ( <div> <ul> { data.map(item => { return <li key={item.id}>{item.name}</li> }) } </ul> </div> ) }
v-bind
иv-on
v-bind
существуетVue
является динамическим свойством привязки,v-on
используется для прослушивания событий, потому чтоReact
Существует также понятие свойств и событий, так что мы находимся вReact
Альтернативы тоже можно найти.
-
существует
Vue
используется вv-bind
иv-on
<template> <div> <!--:value是v-bind:value的简写, @input是v-on:input的简写--> <input :value="value" @input="handleInput" /> </div> </template> <script> export default { data() { return { value: '子君' } }, methods: { handleInput(e) { this.value = e.target.value } } } </script>
-
существует
React
найти альтернативысуществует
Vue
, автор разделяет события и свойства, но вReact
На самом деле события также являются свойствами, поэтому в этом разделе мы не только рассмотрим, как использовать свойства и события, но и как использоватьReact
пользовательское событие в-
разрабатывать
CustomInput
компонентыimport React from 'react' export interface CustomInputProps { value: string; //可以看出 onChange是一个普通的函数,也被定义到了组件的props里面了 onChange: ((value: string,event: React.ChangeEvent<HTMLInputElement>) => void) | undefined; } export default function(props: CustomInputProps) { function handleChange(e: React.ChangeEvent<HTMLInputElement>) { // props.onChange是一个属性,也是自定义的一个事件 props.onChange && props.onChange(e.target.value, e) } return ( <input value={props.value} onChange={handleChange}></input> ) }
-
использовать
CustomInput
компонентыimport React, { useState } from 'react' import CustomInput from './components/CustomInput' export default function() { const [value, setValue] = useState('') function handleChange(value: string) { setValue(value) } return ( <div> <CustomInput value={value} onChange={handleChange}></CustomInput> </div> ) }
Суммировать
только что начал с
Vue
перейти кReact
На самом деле, адаптироваться к этому немного неудобно, но когда вы постепенно привыкнете, вы обнаружите, чтоVue
иReact
Есть много общих черт, на которые можно ссылаться, чтобы учиться. Конечно неважноVue
все ещеReact
, так быстрее начать работу, но вам все равно придется много работать, если вы хотите углубиться в изучение.Vue
иReact
Использование делает более подробное введение, так что следите за обновлениями. -