{
selects.map((item, i) => {
return <button key={ i } onClick={ () => onSelect(item) }>{ item }
})
}
{ result }
)
}
预览
watch.gif
6. style
有时候难免要给元素动态添加样式
style
,Vue
和React
都给我们提供了方便的使用方式。
在使用上基本大同小异:
相同点:
CSS property 名可以用驼峰式 (camelCase) 或短横线分隔 (kebab-case,记得用引号括起来) 来命名
不同点:
-
Vue可以通过数组语法绑定多个样式对象,React主要是单个对象的形式(这点Vue也可以)
-
React 会自动添加 ”px”(这点Vue不会自动处理) 后缀到内联样式为数字的属性,其他单位手动需要手动指定
-
React样式不会自动补齐前缀。如需支持旧版浏览器,需手动补充对应的样式属性。Vue中当 v-bind:style 使用需要添加浏览器引擎前缀的 CSS property 时,如 transform,Vue.js 会自动侦测并添加相应的前缀。
Vue
style源代码点这里
React
style源代码点这里
import React from “react”
export default function Style (){
const style = {
width: ‘100%’,
height: ‘500px’,
}
const style2 = {
backgroundImage: ‘linear-gradient(120deg, #84fab0 0%, #8fd3f4 100%)’,
borderRadius: ‘10px’,
}
return (
)
}
预览
style.png
7. class
如何动态地给元素添加class?Vue中我自己比较喜欢用数组的语法(当然还有对象的写法),React中也可以使用一些第三方包如classnames起到更加便捷添加class的效果。
下面我们看下不借助任何库,如何实现按钮选中的效果
Vue
class源代码点这里
<button :class=“buttonClasses” @click=“onClickActive”>{{ buttonText }}
React
class源代码点这里
import React, { useMemo, useState } from “react”
import ‘./class.css’ // 此处样式与上面是一样的
export default function Class (){
const [ isActive, setIsActive ] = useState(false)
const buttonText = useMemo(() => {
return isActive ? ‘已选中’ : ‘未选中’
}, [ isActive ])
const buttonClass = useMemo(() => {
// 和Vue中不太一样的是我们需要手动join一下,变成’button active’形式
return [ ‘button’, isActive ? ‘active’ : ‘’ ].join(’ ')
}, [ isActive ])
const onClickActive = () => {
setIsActive(!isActive)
}
return (
)
}
预览
8.provide/inject
Vue和React中对于全局状态的管理都有各自好的解决方案,比如Vue中的
Vuex
,React中的redux
和Mobx
,当然小型项目中引入这些有点大材小用了,有没有其他解决方案呢?
Vue中可以使用provide/inject
React中则可以使用Context
假设全局有有一个用户信息userInfo的变量,需要在各个组件中都能便捷的访问到,在Vue和React中该如何实现呢?
Vue
Vue
中借用provide/inject
可以将顶层状态,传递至任意子节点,假设我们再app.vue中声明了一个userInfo
数据
provide源代码点这里
app.vue
provide.vue
React
React
中要实现类似的功能,可以借助Context,将全局状态共享给任意子节点
provide源代码点这里
context/index.js
import { createContext } from “react”;
export const UserInfoContext = createContext({
userInfo: {
name: ‘’
}
})
app.js
import { UserInfoContext } from ‘./context/index’
function App() {
return (
// 注意这里
<UserInfoContext.Provider
value={{ userInfo: { name: ‘前端胖头鱼’ } }}
<Route path=“/v-if” element={} />
<Route path=“/v-show” element={} />
<Route path=“/v-for” element={} />
<Route path=“/computed” element={} />
<Route path=“/watch” element={} />
<Route path=“/style” element={
<Route path=“/class” element={} />
<Route path=“/slot” element={} />
<Route path=“/nameSlot” element={} />
<Route path=“/scopeSlot” element={} />
<Route path=“/provide” element={} />
</UserInfoContext.Provider>
);
}
provide.js
import React, { useContext } from “react”
import { UserInfoContext } from ‘…/context/index’
export default function Provide() {
// 通过userContext,使用定义好的UserInfoContext
const { userInfo } = useContext(UserInfoContext)
return (
)
}
预览
4127923929-provide.png
9. slot(默认插槽)
插槽是
Vue
中非常实用的功能,我把他理解成”坑位“,等待着你从外面把他填上,而这个”坑位“可以分成默认坑位
、具名坑位
、作用域坑位
,咱们通过一个实战例子来看看React
中如何实现同等的功能。
假设我们要实现一个简单的dialog
组件,基本功能是标题可以传字符串,内容部分可以完全自定义,应该怎么实现呢?
Vue
slot源代码点这里
dialog
// 注意这里放了一个默认插槽坑位
slot
<button @click=“onToggleVisible”>切换dialog
:visible.sync=“visible”
title=“默认插槽”
// 这里会替换到的位置处
React
前面通过
props.children
属性可以读取组件标签内的内容算是和Vue
默认插槽实现了一样的功能,但是具名插槽如何实现呢?React
好玩的其中一个点,我觉得是属性啥玩意都可以传、字符串
、数字
、函数
、连DOM
也可以传。所以实现具名插槽也很简单,直接当属性传递就可以
nameSlot源代码点这里
Dialog改造
import React, { useState, useEffect } from “react”
import ‘./dialog.css’
export default function Dialog(props) {
// 原谅我用visible -1这种傻叉的方式先实现了, 重点不是在这里
const { title, main, visible = -1 } = props
const [visibleInner, setVisibleInner] = useState(false)
const onHide = () => {
setVisibleInner(false)
}
useEffect(() => {
setVisibleInner(visible > 0)
}, [ visible ])
return (
{/* { title ?
{/* 注意这里,直接渲染title就可以了 */}
{ title }
{/* 注意这里,通过children实现默认插槽功能 */}
{/* {children} */}
{/* 这一这里不是children了,是main */}
{ main }
)
}
nameSlot
import React, { useState } from “react”
import Dialog from ‘./components/dialog’
import ‘./slot.css’
export default function NameSlot() {
const [visible, setVisible] = useState(-1)
const onToggleVisible = () => {
setVisible(Math.random())
}
return (
visible={visible}
// 注意这里,直接传递的DOM
title={
// 注意这里,直接传递的DOM
main={
)
}
预览
可以看到具名插槽,
React
直接用属性反而更简洁一些
具名插槽.gif
11. scope slot(作用域插槽)
有了
默认插槽
、具名插槽
最后当然少不了作用域插槽啦!有时让插槽内容能够访问子组件中才有的数据是很有用的,这也是作用域插槽的意义所在
假设:Dialog
组件内部有一个userInfo: { name: '前端胖头鱼' }
数据对象,希望使用Dialog
组件的外部插槽也能访问到,该怎么做呢?
Vue
scopeSlot源代码点这里
Dialog
scopeSlot
<button @click=“onToggleVisible”>切换dialog
:visible.sync=“visible”
React
还是那句话,React中万物皆可传,类似实现具名插槽中我们直接传递DOM,同样我们也可以传递函数,将
Dialog
组件内部的userInfo
数据通过函数传参的方式给到外部使用
scopeSlot源代码点这里
Dialog改造
import React, { useState, useEffect } from “react”
import ‘./dialog.css’
export default function Dialog(props) {
// 原谅我用visible -1这种傻叉的方式先实现了, 重点不是在这里
const { title, main, visible = -1 } = props
const [visibleInner, setVisibleInner] = useState(false)
const [ userInfo ] = useState({
name: ‘前端胖头鱼’
})
const onHide = () => {
setVisibleInner(false)
}
useEffect(() => {
setVisibleInner(visible > 0)
}, [ visible ])
return (
{/* 作用域插槽,当函数使用,并且把数据传递进去 */}
{ title(userInfo) }
{/* 作用域插槽,当函数使用,并且把数据传递进去 */}
{ main(userInfo) }
)
}
scopeSlot
import React, { useState } from “react”
import Dialog from ‘./components/dialog’
import ‘./slot.css’
export default function ScopeSlot() {
const [visible, setVisible] = useState(-1)
const onToggleVisible = () => {
setVisible(Math.random())
}
return (
visible={visible}
// 通过函数来实现插槽
title={ () =>
// 接收userInfo数据
main={ (userInfo) =>
)
}
预览
作用域插槽.gif
- EOF -
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。
什么?你问面试题资料在哪里,这不是就在你眼前吗(滑稽
lot**
import React, { useState } from “react”
import Dialog from ‘./components/dialog’
import ‘./slot.css’
export default function ScopeSlot() {
const [visible, setVisible] = useState(-1)
const onToggleVisible = () => {
setVisible(Math.random())
}
return (
visible={visible}
// 通过函数来实现插槽
title={ () =>
// 接收userInfo数据
main={ (userInfo) =>
)
}
预览
作用域插槽.gif
- EOF -
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-Dln6vDGW-1712387610717)]
[外链图片转存中…(img-hxzP5SNk-1712387610717)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
[外链图片转存中…(img-YPvvRb0Y-1712387610718)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。
什么?你问面试题资料在哪里,这不是就在你眼前吗(滑稽