2023年最全前端React18面试题考点

目录

目录

React18

特点

声明式编码

单向数据流 

组件化

虚拟DOM(Virtual Dom)(同Vue)

Diff算法(同Vue)

组件属性

props

state

refs

总结

受控组件和非受控组件

事件event

事件处理的几种方法

事件中this的处理

事件传参处理

鼠标事件 mouseenter与mouseover区别

跨组件通信

生命周期

状态提升

复用组件

Render Props模式

HOC高阶组件模式

Hooks

useState

useReducer

useEffect

useRef

倒计时(⭐手写)

useCallback和useMemo

自定义Hook

StrictMode严格模式

Router

路由模式(同Vue)

基础路由搭建

重定向路由

自定义全局守卫

动态路由

Redux状态管理库

应用

React脚手架

Angular,Vue,React对比

Angular

React和Vue

MVC、MVP、MVVM模式

MVC (Model View Controller)

MVP(Model View Presenter)

MVVM (Model View View Model)


React18

React是用来构造用户界面的JS库 

在React18中,需要使用两个文件来初始化框架:

  • react.development.js 或 react模块 -> 生成虚拟DOM

  • react-dom.development.js 或 react-dom/client模块 -> Diff算法 + 处理真实DOM

下面就是初始化React程序的代码。




  
  
  
  Document
    
  
  


  
 

特点

虚拟DOM,组件化设计模式,声明式代码,单向数据流,使用jsx描述信息

声明式编码

  • 命令式编程:流程(每一步指令怎么去做)
  • 声明式编码:目标,而非流程

因没有指令的概念,所以条件渲染和列表渲染都要通过命令式编程来实现(即JS本身的能力)

map()方法
let app = document.querySelector('#app');
let root = ReactDOM.createRoot(app); 
let data = [
    { id: 1, text: 'aaa' },
    { id: 2, text: 'bbb' },
    { id: 3, text: 'ccc' }
];
let element = (
    
    { data.map(v=>
  • {v.text}
  • ) }
); root.render(element);

单向数据流 

数据主要从父节点传到子节点(通过props),如果父级的某个props改变了,React会重新渲染所有子节点

组件化

可复用的代码可以抽成组件共同使用(UI,方法等) 

每个UI块都是一个组件,每个组件都有一个状态。

虚拟DOM(Virtual Dom)(同Vue)

虚拟 DOM,根据模板生成一个js对象(使用createElement,方法),取代真实的 DOM 。

当页面打开时浏览器会解析 HTML 元素,构建一颗 DOM 树,将状态全部保存起来

Vue和React框架都会自动控制DOM的更新,而直接操作真实DOM是非常耗性能的,所以才有了虚拟DOM的概念

React遵循可观察的模式,并监听状态变化。当组件的状态改变时,React更新虚拟DOM树。

缺点首次渲染大量DOM时,由于多了一层虚拟DOM的计算,会比innerHTML插入慢
 

Diff算法(同Vue)

通过同层的树节点进行比较的高效算法,比较方式:diff整体策略为:深度优先,同层比较

总的来说就是减少DOM,重绘回流


react生成的新虚拟DOM和旧虚拟DOM的比较规则:

  • 如果旧的虚拟DOM中找到了与新虚拟DOM相同的key:

如果内容没有变化,就直接只用之前旧的真实DOM
如果内容发生了变化,就生成新的真实DOM

  • 如果旧的虚拟DOM中没有找到与新虚拟DOM相同的key:

根据数据创建新的真实的DOM,随后渲染到页面上

组件属性

每个 React 组件强制要求必须有一个 render()。它返回一个 React 元素,是原生 DOM 组件的表示。

props

对外公开属性,只读

传递数据


    

传递函数

// 子组件
class Head extends React.Component {
    render(){
        this.props.getData('子组件的问候~~~')
        return (
            
Head Component
); } } // 父组件 class Welcome extends React.Component { getData = (data) => { console.log(data) } render(){ return (
hello world, {this.props.msg}
); } }

构造函数获取props

class Foo {
    constructor(props){
        this.props = props;
    }
}
class Bar extends Foo {
    constructor(props){
        super(props);
        console.log(this.props);
    }
    render(){
        console.log(this.props);
        return '';
    }
}
let props = {
    msg: 'hello world'
};
let b = new Bar(props);
b.props = props;
b.render();

多属性传递props

class Welcome extends React.Component {
    render(){
        //解构
        let { msg, username, age } = this.props;
        console.log( isChecked );
        return (
            
hello world, {msg}, {username}, {age}
); } } let info = { msg: 'hi react', username: 'xiaoming', age: 20 }; let element = ( );

设置props初始值和类型

import PropTypes from 'prop-types'
class Welcome extends React.Component {
    static defaultProps = {
        age: 0
    }
    static propTypes = {
        age: PropTypes.number
    }
    ...
}

state

组件的私有属性,值是对象(可以包含多个key-value的组合)

通过state的变化设置响应式视图受控于当前组件

class Welcome extends React.Component {
    state = {
        msg: 'hello',
        count: 0
    }
    handleClick = () => {   
        this.setState({
            msg: 'hi'
        });
    }
    render(){
        console.log('render');
        return (
            
{this.state.msg}, {this.state.count}
); } } let element = ( );

refs

React操作原生DOM跟Vue框架是类似的,都是通过ref属性来完成的

class Welcome extends React.Component {
    myRef = React.createRef()
    handleClick = () => {   
        //console.log(this.myRef.current);  // 原生DOM input
        this.myRef.current.focus();//获取焦点
    }
    render(){
        return (
            
); } }

总结

props


公开,单向数据流值,父子组件间的唯一通信不可改

1.每个组件对象都会有props(properties的简写)属性

2.组件标签的所有属性都保存在props中

3.内部读取某个属性值:this.props.propertyName

state


私有(通过Ajax获取回来的数据,一般都是私有数据),

React 把组件看成是一个状态机(State Machines),

只需更新组件的 state,然后根据新的 state 重新渲染用户界面(不要操作 DOM)。


refs


当需要获取某一个真实的DOM元素来交互,比如文本框的聚焦、触发强制动画等

当需要操作的元素和获取的元素是同一个时,无需ref

受控组件和非受控组件

非受控组件
现用现取,官方建议尽量少用ref,用多了有一定的效率影响

handleSubmit = (event) => {
            event.preventDefault() //阻止表单提交
            const {username, password} = this//拿到的是form下的username, password结点
            alert(`你输入的用户名是:${username.value},你输入的密码是:${password.value}`)
        }
 
render() {
return (
用户名: this.username = c} type="text" name="username"/> 密码: this.password = c} type="password" name="password"/>


受控组件
将输入维护到state,等需要时再从state取出来

    class Login extends React.Component {
 
//state最好要初始化状态
        state = {
            username: '', //用户名
            password: '' //密码
        }
 
//保存用户名到状态中
        saveUsername = (event) => {
this.setState({username: event.target.value})
        }
 
//保存密码到状态中
        savePassword = (event) => {
this.setState({password: event.target.value})
        }
 
//表单提交的回调
        handleSubmit = (event) => {
          event.preventDefault() //阻止表单提交
          const {username, password} = this.state//获得的是state下的username,password值
          alert(`你输入的用户名是:${username},你输入的密码是:${password}`)
        }

事件event

React中的事件都是采用事件委托的形式,所有的事件都挂载组件容器上,其次event对象是合成处理过的

事件处理的几种方法

import React from 'react'
class Test extends React.Component{
    
    handleClick2(){
        console.log('click2')
    }
 
    hangleClick4 = () =>{
        console.log('click4')
    }
    render(){
        return(
            
            
            
            
        )
    }
}
export default Test

事件中this的处理

class Welcome extends React.Component {
    handleClick = (ev) => {  //推荐 public class fields语法,箭头函数不会创建自己的                                      this,它只会从自己的作用域链的上一层继承 this。
        console.log(this);   //对象
        console.log(ev);
    }
    handleClick(){           //不推荐 要注意修正指向
        console.log(this);   //按钮 
    }
    render(){
        return (
            
hello world
); } } let element = ( );

事件传参处理


推荐采用函数的高阶方式,具体代码如下:

class Welcome extends React.Component {
    handleClick = (num) => {   // 高阶函数
        return (ev) => {
            console.log(num);
        }
    }
    render(){
        return (
            
                                hello world            
        );     } } let element = (     );

鼠标事件 mouseenter与mouseover区别

mouseenter: 鼠标进入被绑定事件监听元素节点时触发一次,再次触发是鼠标移出被绑定元素,再次进入时。而当鼠标进入被绑定元素节点触发一次后没有移出,即使鼠标动了也不再触发

mouseover: 鼠标进入被绑定事件监听元素节点时触发一次,如果目标元素包含子元素,鼠标移出子元素到目标元素上也会触发。

mouseenter 不支持事件冒泡 mouseover 会冒泡

跨组件通信

Welcome传递给Title:

let MyContext = React.createContext();
class Welcome extends React.Component {
    state = {
        msg: 'welcome组件的数据'
    }
    render(){
        return (
            
Hello Welcome
); } } class Head extends React.Component { render(){ return (
Hello Head </div> ); } } class Title extends React.Component { static contextType = MyContext componentDidMount = () => { console.log( this.context ); } render(){ return ( <div> Hello Title <MyContext.Consumer>{ value => value }</MyContext.Consumer> </div> ); } } let element = ( <Welcome /> );</code></pre> </div> <p>通过<code><MyContext.<strong>Provider</strong>></code>组件携带<code>value</code>属性进行向下传递的,</p> <p>那么接收的语法是通过<code><MyContext.<strong>Consumer</strong>></code>组件。</p> <p>也可以定义一个静态方法<code>static contextType = MyContext</code>,这样就可以在逻辑中通过<strong><code>this.context</code></strong>来拿到同样的值。</p> <h2 id="%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F">生命周期</h2> <p><strong>生命周期钩子函数</strong>就是<strong>回调函数</strong>,</p> <p><strong>挂载</strong></p> <ul> <li>constructor():在 React 组件<strong>挂载之前</strong>,会调用它的构造函数。(注:如果不<strong>初始化 state</strong> 或不进行<strong>方法绑定</strong>,则不需要为 React 组件实现构造函数。)</li> <li>render(): class 组件中唯一必须实现的方法。</li> <li>componentDidMount():在<strong>组件挂载后(插入 DOM 树中)</strong>立即调用。依赖于 DOM 节点的<strong>初始化</strong>应该放在这里。</li> </ul> <p><strong>更新</strong></p> <ul> <li>render(): class 组件中唯一必须实现的方法。</li> <li>componentDidUpdate():在<strong>更新</strong>后会被立即调用。<strong>首次渲染</strong>不会执行此方法。</li> </ul> <p><strong>卸载</strong></p> <ul> <li>componentWillUnmount():在组件卸载及销毁之前直接调用。在此方法中执行必要的清理操作,例如,清除 timer,取消网络请求或清除在 componentDidMount() 中创建的订阅等。<br>  </li> </ul> <p>可以看到挂载时和更新时都有<code>render</code>这个方法。这就是为什么<strong>state改变</strong>的时候,会触发<strong><code>render</code>重渲染操作</strong>。</p> <p><a href="http://img.e-com-net.com/image/info8/997d047a1fbd4e2097919e50836e424e.jpg" target="_blank"><img alt="2023年最全前端React18面试题考点_第1张图片" height="326" src="http://img.e-com-net.com/image/info8/997d047a1fbd4e2097919e50836e424e.jpg" width="650" style="border:1px solid black;"></a>​</p> <div> <pre><code class="language-javascript">class Welcome extends React.Component { state = { msg: 'hello world' } constructor(props){ super(props); console.log('constructor'); } componentDidMount = () => { // react中发起ajax请求的初始操作,在这个钩子中完成 console.log('componentDidMount'); } componentDidUpdate = () => { // 等DOM更新后触发的钩子 console.log('componentDidUpdate'); } componentWillUnmount = () => { console.log('componentWillUnmount'); } handleClick = () => { /* this.setState({ msg: 'hi react' }); */ //this.forceUpdate(); root.unmount(); // 触发卸载组件 } render(){ console.log('render'); return ( <div> <button onClick={this.handleClick}>点击</button> { this.state.msg } </div> ); } }</code></pre> </div> <h2 id="%E7%8A%B6%E6%80%81%E6%8F%90%E5%8D%87">状态提升</h2> <p><strong>多个组件</strong>需要<strong>共享</strong>的状态提升到它们最近的<strong>父组件</strong>上,在父组件上改变这个状态然后通过props分发给子组件。对子组件操作,子组件不改变自己的状态。</p> <h2 id="Hooks"><strong>复用组件</strong></h2> <h3 id="Render%20Props%E6%A8%A1%E5%BC%8F">Render Props模式</h3> <p><strong>组件之间</strong>使用一个<strong>值为函数</strong>的 <strong>prop 共享代码</strong>的简单技术。</p> <div> <pre><code class="language-javascript">class MouseXY extends React.Component { state = { x: 0, y: 0 } componentDidMount = () => { document.addEventListener('mousemove', this.move) } componentWillUnmount = () => { document.removeEventListener('mousemove', this.move) } move = (ev) => { this.setState({ x: ev.pageX, y: ev.pageY }); } render(){ return ( <React.Fragment> { this.props.render(this.state.x, this.state.y) } </React.Fragment> ); } } class Welcome extends React.Component { render(){ return ( <MouseXY render={(x, y)=> <div> hello world, {x}, {y} </div> } /> ); } } let element = ( <Welcome /> );</code></pre> </div> <p>render属性后面的值是一个<strong>回调函数</strong>,通过这个函数的形参可以得到组件中的数据,从而实现功能的复用。</p> <h3 id="HOC%E9%AB%98%E9%98%B6%E7%BB%84%E4%BB%B6%E6%A8%A1%E5%BC%8F">HOC高阶组件模式</h3> <p><strong>参数</strong>为<strong>组件</strong>,<strong>返回值</strong>为<strong>新组件</strong>的<strong>函数</strong></p> <div> <pre><code class="language-javascript">function withMouseXY(WithComponent){ return class extends React.Component { state = { x: 0, y: 0 } componentDidMount = () => { document.addEventListener('mousemove', this.move) } componentWillUnmount = () => { document.removeEventListener('mousemove', this.move) } move = (ev) => { this.setState({ x: ev.pageX, y: ev.pageY }) } render(){ return <WithComponent {...this.state} /> } } } class Welcome extends React.Component { render(){ return ( <div> hello world, { this.props.x }, { this.props.y } </div> ); } } const MouseWelcome = withMouseXY(Welcome) let element = ( <MouseWelcome /> );</code></pre> </div> <h2><strong>Hooks</strong></h2> <p>Hook 是 React 16.8 的新增特性,是一个特殊的<strong>函数</strong>,它可以在<strong>不写 class(</strong>即<strong>不用extends React.Component) </strong>的情况下“<strong>钩入</strong>” React 特性<strong>(</strong>即<strong>组件化模块</strong>的特性<strong>)</strong>。</p> <h3 id="useState"><strong>useState</strong></h3> <p>等同组件中的setState()</p> <div> <pre><code class="language-javascript">let { useState } = React;//只能在最顶层使用Hook let Welcome = (props) => {//只能在函数组件中使用Hook //count的初始值0,设置count的函数 const [count, setCount] = useState(0); const handleClick = () => { setCount(count + 1) } return ( <div> <button onClick={handleClick}>点击</button> <div>hello world, { count }</div> </div> ); }</code></pre> </div> <p>与组件中的state一样自动批处理(即合并修改,每次set只渲染一次),可用<code>flushSync</code>方法消除</p> <p>(flush synchronization清洗同步)</p> <div> <pre><code class="language-javascript">setCount((count)=> count+1) setCount((count)=> count+1) setCount((count)=> count+1) <div>{ count }</div> // 渲染 3 let { useState } = React; let { flushSync } = ReactDOM; let Welcome = (props) => {    const [count, setCount] = useState(0);    const [msg, setMsg] = useState('hello');    const handleClick = () => {        flushSync(()=>{          setCount(count + 1)       })        flushSync(()=>{          setMsg('hi')       })         }    return (        <div>            <button onClick={handleClick}>点击</button>            <div>hello world, { count }, { msg }</div>        </div>   ); }</code></pre> </div> <p>useState中的值在修改的时候,并<strong>不会进行原值的合并处理</strong>,所以使用的时候要注意。可利用扩展运算符的形式来解决合并的问题。</p> <div> <pre><code class="language-javascript">const [info, setInfo] = useState({    username: 'xiaoming',    age: 20 }) setInfo({    ...info,    username: 'xiaoqiang' })</code></pre> </div> <p>如果遇到<strong>初始值需要大量运算才能获取</strong>的话,可采用<strong>惰性初始state</strong>,useState()添加回调函数的形式来实现。</p> <div> <pre><code class="language-javascript">const initCount = () => {    console.log('initCount');    return 2*2*2; } const [count, setCount] = useState(()=>{    return initCount(); });</code></pre> </div> <p>这样初始只会计算一次,并不会<strong>每次都重新进行计算</strong>。</p> <h3 id="useReducer"><strong>useReducer</strong></h3> <p>useState 的替代方案。它接收一个形如 (state, action) => newState 的 reducer,并返回当前的 state 以及与其配套的 <strong>dispatch</strong> 方法。</p> <p>在某些场景下,useReducer 会比 useState 更适用,例如 state 逻辑较复杂且包含多个子值,或者下一个 state 依赖于之前的 state 等。</p> <div> <pre><code class="language-javascript">let { useReducer } = React; let loginState = {//体现整体关联性与统一性** isLogin: true, isLogout: false } let loginReducer = (state, action) => { switch(action.type){ case 'login': return { isLogin: true, isLogout: false } case 'logout': return { isLogin: false, isLogout: true } default: throw new Error() } } let Welcome = (props) => { const [ state, loginDispatch ] = useReducer(loginReducer, loginState); const handleLogin = () => { loginDispatch({ type: 'login' }); } const handleLogout = () => { loginDispatch({ type: 'logout' }); } return ( <div> { state.isLogin ? <button onClick={handleLogout}>退出</button> : <button onClick={handleLogin}>登录</button> } </div> ); }</code></pre> </div> <h3 id="useEffect"><strong>useEffect</strong></h3> <p>在函数组件中执行副作用操作,<strong>副作用</strong>即:<strong>DOM操作、获取数据、记录日志</strong>等</p> <p>代替类组件中的<strong>生命周期</strong>钩子函数。<br> 如果不传参:相当于render之后就会执行<br> 如果传空数组:相当于componentDidMount<br> 如果传数组:相当于componentDidUpdate<br> 如果返回回调函数:相当于componentWillUnmount,会在组件卸载的时候执行清除操作。</p> <p>effect 在每次渲染的时候都会执行。React 会在执行当前 effect 之前对上一个 effect 进行清除。</p> <div> <pre><code class="language-javascript">let Welcome = (props) => { const [count, setCount] = useState(0); //异步函数,在浏览器渲染DOM后触发的 useEffect(()=>{ // 初始 和 更新 数据的时候会触发回调函数 console.log('didMount or didUpdate'); return ()=>{ // 这里回调函数可以用来清理副作用 console.log('beforeUpdate or willUnmount'); } }) const handleClick = () => { //setCount(count + 1); root.unmount();//卸载 } return ( <div> <button onClick={handleClick}>点击</button> <div>hello world, { count }</div> </div> ); }</code></pre> </div> <p><strong>关注点分离</strong>后,改变一个数据后,例如count,那么msg相关的useEffect也会触发,</p> <p>给useEffect设置第二个参数,只重新触发自己的useEffect回调函数,即响应式的数据</p> <div> <pre><code class="language-javascript">const [count, setCount] = useState(0); useEffect(()=>{ console.log(count); }, [count]) const [msg, setMsg] = useState('hello'); useEffect(()=>{ console.log(msg); }, [msg])</code></pre> </div> <ul> <li>useEffect()是在<strong>渲染之后</strong>且<strong>屏幕更新之后</strong>,,是<strong>异步</strong>的;</li> <li>useLayoutEffect()是在<strong>渲染之后</strong>但在<strong>屏幕更新之前</strong>,是<strong>同步</strong>的。</li> </ul> <p>大部分情况下我们采用<strong>useEffect()</strong>,<strong>性能更好</strong>。</p> <p>但当你的useEffect里面的操作<strong>需要处理DOM</strong>,并且<strong>会改变页面的样式</strong>,</p> <p>就需要<strong>useLayoutEffect</strong>,否则可能会出现闪屏问题。</p> <h3 id="useRef"><strong>useRef</strong></h3> <div> <pre><code class="language-javascript">let { useRef } = React; let Welcome = (props) => {       const myRef = useRef() ...} 等同于 React.createRef()</code></pre> </div> <p><strong>函数转发</strong></p> <p>把ref添加到函数组件上,把ref对应的对象<strong>转发到子组件</strong>的内部元素身上。</p> <div> <pre><code class="language-javascript">let Head = React.forwardRef((props, ref) => { return ( <div> hello Head <input type="text" ref={ref} /> </div> ) }) let Welcome = (props) => { const myRef = useRef() const handleClick = () => { myRef.current.focus(); } return ( <div> <button onClick={handleClick}>点击</button> <Head ref={myRef} /> </div> ); }</code></pre> </div> <p>    let count = useRef(0);  // 与state类似,有记忆功能,可理解为全局操作<br>     const handleClick = () => {<br>         count.<strong>current</strong>++;</p> <p>...</p> <p>}</p> <h3 id="articleContentId">倒计时(⭐手写)</h3> <pre><code class="language-javascript">//利用setTimeOut,每秒将数值减一 //利用useRef设置定时器,方便清楚 const [time,setTime]=useState(null)//倒计时时间 const timeRef=useRef()//设置延时器 //倒计时 useEffect(()=>{ //如果设置倒计时且倒计时不为0 if(time&&time!==0) timeRef.current=setTimeout(()=>{ setTime(time=>time-1) },1000) //清楚延时器 return ()=>{ clearTimeout(timeRef.current) } },[time]) <button onClick={()=>{settime(60)}} >开始计时</button> </code></pre> <h3 id="useCallback"><strong>useCallback和useMemo</strong></h3> <p>React 使用 <strong><strong>Object.is 比较算法</strong></strong> 来比较 state。</p> <p>当组件数据没有变化时,是不会重新渲染试图,如下,cosole.log不会执行</p> <div> <pre><code class="language-javascript">let Welcome = (props) => { const [ count, setCount ] = useState(0); const handleClick= () => { setCount(0); } console.log(123); return ( <div> <button onClick={handleClick}>点击</button> hello Welcome { Math.random() } </div> ); }</code></pre> </div> <p>当<strong>变化后</strong>state与当前state<strong>相同</strong>时,包括变化前的渲染一共会<strong>渲染两次</strong></p> <p>因为React 可能仍需要在<strong>跳过渲染前 渲染该组件</strong>。</p> <p>但React <strong>不会对组件树的“深层”节点进行不必要的渲染</strong></p> <p><code>React.memo</code><strong>避免</strong>可以没有必要的重新渲染,类似于类组件中的<strong>纯函数</strong>概念。</p> <p>将{ Math.random() } 包装成函数组件</p> <div> <pre><code class="language-javascript">let Welcome = (props) => { const [ count, setCount ] = useState(0); const handleClick= () => { setCount(1); } return ( <div> <button onClick={handleClick}>点击</button> hello Welcome <Head count={count} /> </div> ); } let Head = React.memo(() => { return ( <div>hello Head, { Math.random() }</div> ) })</code></pre> </div> <p>在<strong>渲染期间</strong>执行了<strong>高开销</strong>的计算,则可以使用 <code>useMemo</code> 来进行<strong>优化</strong>。</p> <p>useCallback返回一个<strong>可记忆</strong>的<strong>函数</strong>,useMemo返回一个可记忆的<strong>值</strong>,useCallback只是useMemo的一种<strong>特殊形式</strong>。</p> <div> <pre><code class="language-javascript">let Welcome = (props) => { const [ count, setCount ] = useState(0); const handleClick= () => { setCount(count+1); } const foo = () => {} return ( <div> <button onClick={handleClick}>点击</button> hello Welcome <Head onClick={foo} /> </div> ); } let Head = React.memo(() => { return ( <div>hello Head, { Math.random() }</div> ) })</code></pre> </div> <p>当点击按钮的时候,<Head>组件会进行重新渲染,因为每次重新触发<Welcome>组件的时候,后会重新生成一个<strong>新的内存地址</strong>的foo函数。</p> <p>通过useCallback和useMemo可以不让foo函数重新生成,使用之前的函数地址</p> <p>从而<strong>减少子组件的渲染,提升性能</strong>。</p> <div> <pre><code class="language-javascript">const foo = useCallback(() => {}, []) const foo = useMemo(()=> ()=>{}, [])   // 针对函数 const bar = useMemo(()=> [1,2,3], [])  // 针对数组 const foo = useMemo(()=> ()=>{}, [count])   // 第二个参数为依赖项,当count改变时,函数重新创建</code></pre> </div> <h3 id="%E8%87%AA%E5%AE%9A%E4%B9%89Hook"><strong>自定义Hook</strong></h3> <p><strong>实现函数组件复用</strong></p> <div> <pre><code class="language-javascript">let { useState, useEffect } = React let useMouseXY = () => { const [x, setX] = useState(0) const [y, setY] = useState(0) useEffect(()=>{ function move(ev){ setX(ev.pageX) setY(ev.pageY) } document.addEventListener('mousemove', move) //如果返回回调函数:相当于componentWillUnmount,会在组件卸载的时候执行清除操作。 return () => { document.removeEventListener('mousemove', move) } }, [])//如果传空数组:相当于componentDidMount return { x, y } } let Welcome = ()=>{ const {x, y} = useMouseXY() return ( <div> hello Welcome, {x}, {y} </div> ) }</code></pre> </div> <h2 id="Redux">StrictMode严格模式</h2> <p><code>StrictMode</code> 是一个用来突出显示应用程序中<strong>潜在问题</strong>的工具。用于<strong>开发</strong>环境</p> <p>与 <code>Fragment</code> 一样,<code>StrictMode</code> <strong>不会渲染任何可见的 UI</strong>。它为其后代元素触发额外的检查和警告。例如:</p> <ul> <li>识别不安全的<strong>过时</strong>的生命周期</li> <li>关于使用<strong>过时</strong>字符串 ref API 的警告</li> </ul> <p><strong>发布环境</strong>下关闭严格模式,以避免<strong>性能</strong>损失。</p> <h2 id="Router">Router</h2> <p>路由是根据<strong>不同的url地址</strong>展示不同的内容或页面,是SPA(单页应用)的<strong>路径管理器</strong>,</p> <p></p> <p>1.一个路由就是一个映射关系(key:value)</p> <p>2.key为路径, value可能是function或component</p> <p>Router 用于定义多个路由,当用户定义特定的 URL 时,如果此 URL 与 Router 内定义的任何 “路由” 的路径匹配,则用户将<strong>重定向</strong>到该特定路由。</p> <h3 id="%E8%B7%AF%E7%94%B1%E6%A8%A1%E5%BC%8F">路由模式(同Vue)</h3> <p>React中的路由模式跟Vue中一样,分为history和hash模式。默认是hash</p> <p><strong>Hash模式</strong></p> <p>hash——即地址栏URL中的#符号(此hash不是密码学里的散列运算)。比如在 http://localhost:8080/#/donate 中,hash的值就是#/donate,我们在浏览器中可以通过BOM中的window.location.hash来获取当前URL的hash值</p> <p>注:BOM(Browser Object Model) 是指浏览器对象模型,BOM由多个对象组成,其中代表浏览器窗口的Window对象是BOM的顶层对象,其他对象都是该对象的子对象。</p> <p><a href="http://img.e-com-net.com/image/info8/6204a902d96647cabe097caacccec111.jpg" target="_blank"><img alt="2023年最全前端React18面试题考点_第2张图片" height="287" src="http://img.e-com-net.com/image/info8/6204a902d96647cabe097caacccec111.jpg" width="650" style="border:1px solid black;"></a>​</p> <p><strong>history模式</strong></p> <p>通过在<strong>host</strong>后,直接添加<strong>斜线</strong>和<strong>路径</strong>来<strong>请求后端</strong>的一种<strong>URL模式</strong>。</p> <p><a href="http://img.e-com-net.com/image/info8/af41845fc3684e04b97ed08bf621607f.jpg" target="_blank"><img alt="2023年最全前端React18面试题考点_第3张图片" height="280" src="http://img.e-com-net.com/image/info8/af41845fc3684e04b97ed08bf621607f.jpg" width="650" style="border:1px solid black;"></a>​</p> <p>图中pathname变量为/donate,而hash值为空。</p> <p><strong>原理</strong></p> <ul> <li>hash通过<strong>window.addEventListener</strong>监听浏览器的<strong>onhashchange()</strong>事件变化,查找对应的路由规则</li> <li><strong>HTML5</strong>的<strong>history API</strong>监听URL变化,所以有浏览器兼容问题</li> </ul> <p></p> <p><strong>区别</strong></p> <ul> <li>是否向后端传参:</li> </ul> <p>    在hash模式中,我们刷新一下上面的网页,可以看到请求的URL为http://localhost:8080/,没有带上#/donate,说明hash 虽然出现 URL 中,#后面的内容是不会包含在http请求中的,对后端完全没有影 响,因此改变 hash 不会重新加载页面。</p> <p><img alt="" height="0" src="http://img.e-com-net.com/image/info8/263e2912ee264011b1b3352f17e1f89d.jpg" width="0">​</p> <p>在history模式中,刷新一下网页,明显可以看到请求url为完整的url,url完整地请求了后端:</p> <p><a href="http://img.e-com-net.com/image/info8/48f77071b1ec4b2eaaa86c2c7145fdca.jpg" target="_blank"><img alt="2023年最全前端React18面试题考点_第4张图片" height="298" src="http://img.e-com-net.com/image/info8/48f77071b1ec4b2eaaa86c2c7145fdca.jpg" width="650" style="border:1px solid black;"></a>​</p> <p>前端的 URL 必须和实际向后端发起请求的 URL 一致,否则返回 404 错误<br><br>  </p> <p>在React中</p> <ul> <li> <p>history模式:createBrowserRouter</p> </li> </ul> <p>IE9及以下不兼容,需要由<strong>web server</strong>支持,在<strong>web client</strong>这边window.location.<strong>pathname</strong>被<strong>react router</strong>解析</p> <ul> <li> <p>hash模式:createHashRouter</p> </li> </ul> <p>不需要由web server支持,因为它的只有<strong>‘/’path</strong>需要由web server支持,而<strong>#/react/route URL</strong>不能被web server读取,在<strong>web client</strong>这边window,location.<strong>hash</strong>被<strong>react router</strong>解析</p> <p></p> <p>history的好处是可以进行修改历史记录,并且不会立刻像后端发起请求。不过如果对于项目没有硬性标准要求,可以直接使用hash模式开发。</p> <h3 id="%E5%9F%BA%E7%A1%80%E8%B7%AF%E7%94%B1%E6%90%AD%E5%BB%BA">基础路由搭建</h3> <div> <pre><code class="language-javascript">import { createBrowserRouter, createHashRouter } from 'react-router-dom' //路由表 export const routes = []; //路由对象 const router = createBrowserRouter(routes); export default router;</code></pre> </div> <p>接下来让路由配置文件与React结合,需要在主入口index.js进行操作,如下:</p> <div> <pre><code class="language-javascript">import { RouterProvider } from 'react-router-dom' import router from './router'; const root = ReactDOM.createRoot(document.getElementById('root')); root.render(  <React.StrictMode>    <RouterProvider router={router}></RouterProvider>  </React.StrictMode> );</code></pre> </div> <p>路由表的配置字段如下:</p> <ul> <li> <p>path:指定路径</p> </li> <li> <p>element:对应组件</p> </li> <li> <p>children:嵌套路由</p> </li> </ul> <div> <pre><code class="language-javascript">//路由表 export const routes = [   {        path: '/',        element: <App />,        children: [           {                path: '',                element: <Home />           },   {                path: 'about',                element: <About />,                children: [                   {                        path: 'foo',                        element: <Foo />,                   },                   {                        path: 'bar',                        element: <Bar />,                   }   ]   }       ]   } ];</code></pre> </div> <p>接下来就是显示路由区域,利用<strong><outlet>组件占位</strong>,表明<strong>子路由渲染的位置</strong></p> <div> <pre><code class="language-javascript">import React from "react"; import { Outlet, Link } from 'react-router-dom' function App() {  return (    <div className="App">      <h2>hello react</h2>      <Link to="/">首页</Link> | <Link to="/about">关于</Link>      <Outlet />    </div> ); } export default App;</code></pre> </div> <p>可以看到 <Link>组件用于<strong>声明式</strong>路由切换使用。同样<outlet>组件也可以给嵌套路由页面进行使用,从而完成二级路由的切换操作。</p> <div> <pre><code class="language-javascript">import React from 'react' import './About.scss' import { Outlet, Link } from 'react-router-dom' export default function About() {  return (    <div>      <h3>About</h3>      <Link to="/about/foo">foo</Link> | <Link to="/about/bar">bar</Link>      <Outlet />    </div> ) } ​ </code></pre> </div> <h3 id="%E9%87%8D%E5%AE%9A%E5%90%91%E8%B7%AF%E7%94%B1">重定向路由</h3> <p>访问的URL跳转到另一个URL上,从而实现重定向的需求。</p> <p><Navigate>组件就是实现重定向需求的组件。</p> <div> <pre><code class="language-javascript">import { createBrowserRouter, createHashRouter, Navigate } from 'react-router-dom' children: [ { index: true,// 默认路由 element: <Navigate to="/about/foo/123" />, }, { path: 'foo', element: <Foo /> }, { path: 'bar', element: <Bar /> } ]</code></pre> </div> <h3 id="%E8%87%AA%E5%AE%9A%E4%B9%89%E5%85%A8%E5%B1%80%E5%AE%88%E5%8D%AB">自定义全局守卫</h3> <p>全局守卫:包裹根组件,访问根组件下面的所有子组件都要先通过守卫进行操作</p> <p>在React里面,它不像Vue一样,为我们提供和很多方便的功能,一些功能都需要自己去进行封装比如说路由拦截</p> <p>在/src/components/BeforeEach.jsx下创建守卫的组件。</p> <div> <pre><code class="language-javascript">import React from 'react' import { Navigate } from 'react-router-dom' import { routes } from '../../router'; export default function BeforeEach(props) {  if(true){    return <Navigate to="/login" /> }  else{    return (      <div>{ props.children }</div>   ) } }</code></pre> </div> <p>根据判断的结果,是否进入到组件内,还是重定向到其他的组件内。</p> <p>调用BeforeEach.jsx,index.js通过路由配置文件引入,如下:</p> <div> <pre><code class="language-javascript">export const routes = [ {    path: '/',    element: <BeforeEach><App /></BeforeEach>//包裹根组件APP } ]</code></pre> </div> <h3 id="%E5%8A%A8%E6%80%81%E8%B7%AF%E7%94%B1">动态路由</h3> <p>根据<strong>不同的UR</strong>L,可以访问<strong>同一个组件</strong>。在React路由中,通过<strong>path</strong>字段来指定动态路由的写法。</p> <p>foo/xxx都能访问到Foo组件,本身就有实现了动态路由</p> <div> <pre><code class="language-javascript">import { Outlet, Link } from 'react-router-dom' export default function About() { return ( <div> <Link to="/about/foo/123">foo 123</Link> | <Link to="/about/foo/456">foo 456</Link> </div> ) }</code></pre> </div> <div> <pre><code class="language-javascript">{ path: 'foo/:id', element: <Foo /> }</code></pre> </div> <p><code>id</code>就是<strong>变量名</strong>,可以在组件中用<code>useParams</code>来获取到对应的值。</p> <div> <pre><code class="language-javascript">import { useParams } from 'react-router-dom' export default function Foo() { const params = useParams() return ( <div>Foo, { params.id }</div> ) }</code></pre> </div> <h2 id="Redux%E7%8A%B6%E6%80%81%E7%AE%A1%E7%90%86%E5%BA%93">Redux状态管理库</h2> <p>Redux就像Vue中的<strong>Vuex</strong>或<strong>Pinia</strong>是一样专门用于做<strong><strong>状态管理</strong></strong>的JS库(不是react插件库)。</p> <p>只不过Redux比较独立,可以跟很多框架结合使用,不过主要还是跟React配合比较好,也是最常见的React状态管理的库。</p> <p>redux相当于在<strong>顶层组件</strong>之上又加了一个<strong>组件</strong></p> <p></p> <p><a href="http://img.e-com-net.com/image/info8/ca80841dc35948008912665b9c78ca21.jpg" target="_blank"><img alt="2023年最全前端React18面试题考点_第5张图片" src="http://img.e-com-net.com/image/info8/ca80841dc35948008912665b9c78ca21.jpg" width="650" height="389" style="border:1px solid black;"></a>​</p> <div> <pre><code class="language-javascript">//state存储共享数据 function counterReducer(state={count: 0}, action) {//reducer修改state    switch(action.type){        case 'inc': return {count: state.count + state.payload}        default:            return state;   } } const store = createStore(counterReducer) export default store</code></pre> </div> <p>这样store对象就可以在其他组件中进行使用了,例如在<Bar>组件中。</p> <div> <pre><code class="language-javascript">import React from 'react' import './Bar.scss' import { useSelector,useDispatch } from 'react-redux' export default function Bar() {  const count = useSelector((state)=> state.count)//获取共享状态  const dispatch=useDispatch();//修改共享状态  const handleClick = () => {    dispatch({//dispatch触发Reducer,分发action      type: 'inc',      payload: 5   }) }  return (    <div>     <button onClick={handleClick}>修改count</button>         Bar, { count }    </div> ) }</code></pre> </div> <p>在主模块中进行注册。</p> <div> <pre><code class="language-javascript">import { RouterProvider } from 'react-router-dom' import router from './router'; import { Provider } from 'react-redux' import store from './store'; const root = ReactDOM.createRoot(document.getElementById('root')); root.render(  <React.StrictMode>    <Provider store={store}>//注册状态管理与React结合,自动完成重渲染      <RouterProvider router={router}></RouterProvider>    </Provider>  </React.StrictMode> );</code></pre> </div> <h3 id="%E5%BA%94%E7%94%A8">应用</h3> <p>从项目的整体看</p> <ul> <li>不同身份的<strong>用户</strong>有不同的使用方式(比如普通用户和管理员)</li> <li>多个用户之间可以<strong>协作</strong></li> <li>与服务器大量<strong>交互</strong>,或者使用了 WebSocket</li> <li>View 要从<strong>多个来源</strong>获取数据</li> </ul> <p>从组件角度看</p> <ul> <li>某个组件的状态,需要<strong>共享</strong></li> <li>组件有相当<strong>大量</strong>的,<strong>随时间变化</strong>的数据</li> <li>state 需要有一个<strong>单一可靠</strong>数据源</li> </ul> <h2 id="Angular%2CVue%2CReact">React脚手架</h2> <p>开始一个react项目,<strong>不用手动配置</strong>,直接开发</p> <h2 id="Angular%2CVue%2CReact%E5%8C%BA%E5%88%AB">Angular,Vue,React对比</h2> <h3 id="Angular"><br> Angular</h3> <p>框架比较成熟<strong>完整</strong>,过于庞大,上手难;</p> <h3 id="React%E5%92%8CVue">React和Vue</h3> <p><strong>相同点</strong> :</p> <p>创建<strong>UI的js库</strong></p> <p>都是使用了<strong>虚拟dom</strong></p> <p><strong>组件化</strong>开发</p> <p><strong>父子</strong>之间通信<strong>单项数据流</strong></p> <p>都支持<strong>服务端渲染</strong></p> <p></p> <p><strong>不同点</strong>:</p> <p>vue轻量级框架,其核心库<strong>只关注视图层</strong>,简单小巧、易学易上手;</p> <p>个人维护项目; 适合于<strong>移动端</strong>开发; </p> <p>reacct 的jsx,可读性好</p> <p>vue的是 template</p> <p>数据变化,react <strong>手动 setState</strong> vue<strong>自动响应式处理</strong> proxy object.DefineProperty</p> <p>react 单向数据流 ,vue双向数据流</p> <p>react 的 redux mobx</p> <p>vue 的vuex  pinia</p> <h2 id="MVC%E3%80%81MVP%E3%80%81MVVM%E6%A8%A1%E5%BC%8F"><strong>MVC、MVP、MVVM模式</strong></h2> <h3 id="MVC%20%EF%BC%88Model%20View%20Controller%EF%BC%89-React">MVC (Model View Controller)</h3> <p></p> <ul> <li>Model(模型):<strong>提供数据</strong></li> <li>View(视图):<strong>显示数据</strong></li> <li>Controller(控制器):<strong>用户交互</strong></li> </ul> <p><strong>【优点】</strong></p> <p><strong>耦合性低,方便维护</strong>,可以利于分工协作 重用性高</p> <p><strong>【缺点】</strong></p> <p>使得项目架构变得<strong>复杂</strong>,对开发人员要求高</p> <h3 id="MVP%EF%BC%88Model%20View%20Presenter%EF%BC%89">MVP(Model View Presenter)</h3> <p>从MVC演变而来,它们的基本思想有相通的地方<strong>Controller/Presenter</strong>负责逻辑的处理,</p> <h3 id="MVVM%20%EF%BC%88Model-View-ViewModel%EF%BC%89-Vue">MVVM (Model View View Model)</h3> <p><strong>视图</strong>和<strong>业务逻辑</strong>分开。</p> <p><strong>View视图层</strong>,<strong>Model 数据模型</strong>,<strong>ViewModel </strong>是它们<strong>双向绑定的桥梁,自动同步更新</strong></p> <p><strong>【优点】</strong></p> <p>相比mvp各层的<strong>耦合度</strong>更低,一个viewmodel层可以给多个view层共用(<strong>一对多</strong>),提高代码的<strong>可重用性</strong>。</p> <p>*<strong>耦合度:模块间依赖的程度。</strong></p> <p><strong>【缺点】</strong></p> <p>因为使用了<strong>dataBinding</strong>,增加了大量的<strong>内存开销</strong>,增加了程序的<strong>编译</strong>时间,所以适合<strong>轻量级</strong>项目。</p> <p>数据绑定使得 <strong>Bug 很难被调试</strong>。你看到界面异常了,有可能是你 <strong>View</strong> 的代码有 Bug,也可能是 <strong>Model</strong> 的代码有问题</p> <p></p> <p>React和Vue都用了MVVM</p> <p>React单向数据流:只能由<strong>数据</strong>层的变化去影响<strong>视图</strong>层的变化</p> <p>Vue双向数据绑定</p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1644025783804551168"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(前端,javascript,前端,react.js)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1892446115870076928.htm" title="JavaScript网页设计案例:打造交互式个人简历网站" target="_blank">JavaScript网页设计案例:打造交互式个人简历网站</a> <span class="text-muted">程序媛小果</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a> <div>在当今数字化时代,个人简历不再局限于纸质文档,而是越来越多地以网页形式呈现。JavaScript作为一种强大的客户端脚本语言,为网页设计提供了无限可能,使得网页不仅仅是静态的信息展示,而是具有丰富交互性的平台。本文将通过一个案例,展示如何使用HTML、CSS和JavaScript来设计一个交互式的个人简历网站。1.项目概述本案例的目标是创建一个个人简历网站,它不仅展示个人信息、工作经历、教育背景和</div> </li> <li><a href="/article/1892446114204938240.htm" title="ECMAScript与JavaScript:探索两者之间的联系与区别" target="_blank">ECMAScript与JavaScript:探索两者之间的联系与区别</a> <span class="text-muted">程序媛小果</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>在Web开发的早期,JavaScript成为了客户端脚本语言的代名词,而随着时间的推移,JavaScript已经发展成为一个功能强大的语言,它的影响力远远超出了浏览器的范畴。在这场语言演进的过程中,ECMAScript扮演了一个关键角色。本文将深入探讨ECMAScript与JavaScript之间的关系,以及它们之间的主要区别。1.什么是ECMAScript?ECMAScript是由欧洲计算机制造</div> </li> <li><a href="/article/1892433617058066432.htm" title="使用Odoo Shell卸载模块" target="_blank">使用Odoo Shell卸载模块</a> <span class="text-muted">odoo中国</span> <a class="tag" taget="_blank" href="/search/odoo/1.htm">odoo</a><a class="tag" taget="_blank" href="/search/odoo/1.htm">odoo</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90%E8%BD%AF%E4%BB%B6/1.htm">开源软件</a><a class="tag" taget="_blank" href="/search/erp/1.htm">erp</a> <div>使用OdooShell卸载模块我们在Odoo使用过程中,因为模块安装错误或者前端错误等导致odoo无法通过界面登录,这时候你可以使用OdooShell来卸载模块。OdooShell是一个交互式Pythonshell,允许你直接与Odoo数据库和模型进行交互。以下是使用OdooShell卸载模块的详细步骤:步骤1:启动OdooShell要启动OdooShell,你需要在终端中运行以下命令。确保你已经</div> </li> <li><a href="/article/1892426166254497792.htm" title="基于 Spring Boot 的社区居民健康管理系统部署说明书" target="_blank">基于 Spring Boot 的社区居民健康管理系统部署说明书</a> <span class="text-muted">小星袁</span> <a class="tag" taget="_blank" href="/search/%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1%E5%8E%9F%E6%96%87/1.htm">毕业设计原文</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>目录1系统概述2准备资料3系统安装与部署3.1数据库部署3.1.1MySQL的部署3.1.2Navicat的部署3.2服务器部署3.3客户端部署4系统配置与优化5其他基于SpringBoot的社区居民健康管理系统部署说明书1系统概述本系统主要运用了SpringBoot框架,前端页面的设计主要依托Vue框架来构建,实现丰富且交互性强的用户界面,后台管理功能则采用SpringBoot框架与MySQL数</div> </li> <li><a href="/article/1892415446636883968.htm" title="null和undefined的区别" target="_blank">null和undefined的区别</a> <span class="text-muted">编程星空</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>null和undefined是JavaScript中两个特殊的值,它们都表示“无”或“空”,但在语义和使用场景上有明显区别。以下是它们的详细对比:1.定义undefined表示变量已声明但未赋值,或函数没有返回值时的默认返回值。是JavaScript引擎默认赋予的初始值。类型为undefined。null表示一个空对象指针,通常用于显式表示“无”或“空”。是开发者主动赋值的值。类型为object(</div> </li> <li><a href="/article/1892413304811352064.htm" title="dreamweaver html语言,Dreamweaver网页设计与制作(HTML+CSS+JavaScript)" target="_blank">dreamweaver html语言,Dreamweaver网页设计与制作(HTML+CSS+JavaScript)</a> <span class="text-muted">weixin_39979245</span> <a class="tag" taget="_blank" href="/search/dreamweaver/1.htm">dreamweaver</a><a class="tag" taget="_blank" href="/search/html%E8%AF%AD%E8%A8%80/1.htm">html语言</a> <div>Dreamweaver网页设计与制作(HTML+CSS+JavaScript)编辑锁定讨论上传视频本词条缺少信息栏,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!《Dreamweaver网页设计与制作(HTML+CSS+JavaScript)》是2014年清华大学出版社出版的图书。Dreamweaver网页设计与制作(HTML+CSS+JavaScript)图书详细信息编辑ISBN:978</div> </li> <li><a href="/article/1892412800781840384.htm" title="html 5中css的含义,HTML 5+CSS+JavaScript网页设计与制作" target="_blank">html 5中css的含义,HTML 5+CSS+JavaScript网页设计与制作</a> <span class="text-muted">律保阁-Michael</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/5%E4%B8%ADcss%E7%9A%84%E5%90%AB%E4%B9%89/1.htm">5中css的含义</a> <div>HTML5+CSS+JavaScript网页设计与制作编辑锁定讨论上传视频《HTML5+CSS+JavaScript网页设计与制作》是2019年4月清华大学出版社出版的图书,作者是彭进香、张茂红、王玉娟、叶娟、孙秀娟、万幸、刘英。书名HTML5+CSS+JavaScript网页设计与制作作者彭进香张茂红王玉娟叶娟作者孙秀娟展开作者孙秀娟万幸刘英收起出版社清华大学出版社出版时间2019年4月定价48</div> </li> <li><a href="/article/1892412295414345728.htm" title="html+css+javascript实用详解,HTML+CSS+JavaScript 课程标准" target="_blank">html+css+javascript实用详解,HTML+CSS+JavaScript 课程标准</a> <span class="text-muted">vvv666s</span> <div>②学会运用HTML语言中的标记设置颜色、文本格式和列表;熟练掌握颜色值的配置和背景图案的设置方法,熟练掌握字符、链接颜色的设置方法;③掌握在网页中添加CSS、嵌入图像、声音、多媒体信息的方法;④熟练掌握表格的使用方法,学会利用表格设布局网页;掌握框架制作网页的方法,会使用框架设计网页;掌握制作表单的方法,会利用表单建立交互式页面;⑤掌握JavaScript语言的语法;⑥掌握在HTML语言代码中嵌入</div> </li> <li><a href="/article/1892410529520087040.htm" title="JavaScript的魔法世界:巧妙之处与实战技巧" target="_blank">JavaScript的魔法世界:巧妙之处与实战技巧</a> <span class="text-muted">skyksksksksks</span> <a class="tag" taget="_blank" href="/search/%E7%BB%BC%E5%90%88%E4%B8%AA%E4%BA%BA%E6%9D%82%E8%AE%B0/1.htm">综合个人杂记</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>一、从浏览器玩具到全栈利器的蜕变之路JavaScript诞生于1995年,原本只是网景公司为浏览器设计的"小脚本"。谁能想到这个曾被戏称为"玩具语言"的家伙,如今已蜕变成支撑现代Web开发的擎天柱?就像一只破茧成蝶的幼虫,JavaScript经历了ECMAScript标准的持续进化,在Node.js的加持下突破了浏览器的桎梏,实现了从客户端到服务端的华丽转身。V8引擎的涡轮增压让它跑得比猎豹还快,</div> </li> <li><a href="/article/1892407882675187712.htm" title="前端性能优化——如何提高页面加载速度?" target="_blank">前端性能优化——如何提高页面加载速度?</a> <span class="text-muted">忘川...</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">性能优化</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a> <div>1.将样式表放在头部首先说明一下,将样式表放在头部对于实际页面加载的时间并不能造成太大影响,但是这会减少页面首屏出现的时间,使页面内容逐步呈现,改善用户体验,防止“白屏”。我们总是希望页面能够尽快显示内容,为用户提供可视化的回馈,这对网速慢的用户来说是很重要的。将样式表放在文档底部会阻止浏览器中的内容逐步出现。为了避免当样式变化时重绘页面元素,浏览器会阻塞内容逐步呈现,造成“白屏”。这源自浏览器的</div> </li> <li><a href="/article/1892407376435277824.htm" title="前端开发入门指南:HTML、CSS和JavaScript基础知识" target="_blank">前端开发入门指南:HTML、CSS和JavaScript基础知识</a> <span class="text-muted">方向感超强的</span> <a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>引言:大家好,我是一名简单的前端开发爱好者,对于网页设计和用户体验的追求让我深深着迷。在本篇文章中,我将带领大家探索前端开发的基础知识,涵盖HTML、CSS和JavaScript。如果你对这个领域感兴趣,或者想要了解如何开始学习前端开发,那么这篇文章将为你提供一个良好的起点。1.前端开发概述在我们深入了解前端开发的细节之前,让我们先了解一下前端开发的定义和作用。简而言之,前端开发涉及构建用户直接与</div> </li> <li><a href="/article/1892404729082867712.htm" title="前端504错误分析" target="_blank">前端504错误分析</a> <span class="text-muted">ox0080</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/%E5%8C%97%E6%BC%82%2B%E6%BB%B4%E6%BB%B4%E5%87%BA%E8%A1%8C/1.htm">北漂+滴滴出行</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/VIP/1.htm">VIP</a><a class="tag" taget="_blank" href="/search/%E6%BF%80%E5%8A%B1/1.htm">激励</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>前端出现504错误(网关超时)通常是由于代理服务器未能及时从上游服务获取响应。以下是详细分析步骤和解决方案:1.确认错误来源504含义:代理服务器(如Nginx、Apache)在等待后端服务响应时超时。常见架构:前端→代理服务器→后端服务,问题通常出在代理与后端之间。2.排查步骤(1)检查后端服务状态确认服务是否运行:通过日志或监控工具(如systemctlstatus,KubernetesPod</div> </li> <li><a href="/article/1892400189780586496.htm" title="js如何直接下载文件流" target="_blank">js如何直接下载文件流</a> <span class="text-muted">涔溪</span> <a class="tag" taget="_blank" href="/search/js/1.htm">js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>在JavaScript中直接处理文件下载,尤其是在处理文件流的情况下,通常涉及到使用fetchAPI或者XMLHttpRequest来获取文件流,并通过创建一个临时的标签(锚点元素)触发下载。以下是使用fetchAPI的一个示例:fetch('你的文件URL',{method:'GET',headers:{//如果需要的话,可以在这里添加请求头}}).then(response=>response</div> </li> <li><a href="/article/1892398803407925248.htm" title="部署前端项目2" target="_blank">部署前端项目2</a> <span class="text-muted">augenstern416</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>前端项目的部署是将开发完成的前端代码发布到服务器或云平台,使其能够通过互联网访问。以下是前端项目部署的常见步骤和工具:1.准备工作在部署之前,确保项目已经完成以下步骤:代码优化:压缩JavaScript、CSS和图片文件,减少文件体积。环境配置:区分开发环境和生产环境(如API地址、环境变量等)。测试:确保项目在本地测试通过,没有明显Bug。2.部署流程1.构建项目大多数前端项目(如React、V</div> </li> <li><a href="/article/1892398677004185600.htm" title="对象的操作" target="_blank">对象的操作</a> <span class="text-muted">augenstern416</span> <a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a> <div>在前端开发中,JavaScript提供了许多内置对象和方法,用于处理数据、操作DOM、处理事件等。以下是一些常用对象及其方法和扩展技巧:1.Object对象Object是JavaScript中最基础的对象,几乎所有对象都继承自Object。常用方法Object.keys(obj):返回对象的所有可枚举属性的键名数组。constobj={a:1,b:2};console.log(Object.key</div> </li> <li><a href="/article/1892390738520502272.htm" title="前端基础入门:HTML、CSS 和 JavaScript" target="_blank">前端基础入门:HTML、CSS 和 JavaScript</a> <span class="text-muted">阿绵</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/js/1.htm">js</a> <div>在现代网页开发中,前端技术扮演着至关重要的角色。无论是个人网站、企业官网,还是复杂的Web应用程序,前端开发的基础技术HTML、CSS和JavaScript都是每个开发者必须掌握的核心技能。本文将详细介绍这三者的基本概念及其应用一、HTML——网页的骨架HTML(HyperTextMarkupLanguage)是构建网页的基础语言。它是网页的结构和内容的标记语言,决定了网页上的文本、图像、表单等元</div> </li> <li><a href="/article/1892389477767245824.htm" title="网页制作03-html,css,javascript初认识のhtml的图像设置" target="_blank">网页制作03-html,css,javascript初认识のhtml的图像设置</a> <span class="text-muted">Ama_tor</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E9%A1%B5%E5%88%B6%E4%BD%9C%E4%B8%93%E6%A0%8F/1.htm">网页制作专栏</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>一、图像格式网页中图像的格式有三种,Gif,Jpeg,PngGif:Graphicinterchangeformat图像交换格式,文件最多可使用256种颜色,最适合显示色调不连续或具有大面积单一颜色的图像,例如导航条、按钮、图标、徽标或其他具有统一色彩和色调的图像;还可以制作动态图像Jpeg:Giantphotographicexpectgroup,它是一种图像压缩格式,可包含数百万种颜色,不支持</div> </li> <li><a href="/article/1892386200312934400.htm" title="JavaScript——操作浏览器窗口" target="_blank">JavaScript——操作浏览器窗口</a> <span class="text-muted">yiqi_perss</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a> <div>学习内容:今天学习了alert提示框,提示框中的内容,就是alert后边小括号中的内容例如:alert('我要学JavaScript!');alert('我要学习!');学习总结:日常小总结例如:后面的分号;可以随便去掉,不影响运行效果。不能去掉小括号,否则会报错,不信你可以试试。必须是英文引号,否则会报错。课外扩展:历史渊源例如:ECMAScript是一种语言标准,而JavaScript是网景公</div> </li> <li><a href="/article/1892360084474884096.htm" title="前端超长列表,虚拟滚动实现" target="_blank">前端超长列表,虚拟滚动实现</a> <span class="text-muted">大橙子-</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>虚拟滚动.container{width:300px;height:500px;overflow:hidden;border:1pxsolid#ccc;margin-top:50px;}.scroll-box{width:100%;height:100%;overflow-y:auto;overflow-x:hidden;position:relative;}.scroll-height-main</div> </li> <li><a href="/article/1892346975152566272.htm" title="前端框架虚拟DOM的产生" target="_blank">前端框架虚拟DOM的产生</a> <span class="text-muted">大橙子-</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>直接说结论:为了找出与命令式(原生实现步骤)所执行代码的最小差异化,从而优化代码性能。命令式:可以理解为面向过程编程,需要写好每个实现步骤constdiv=document.querySelector('#app')//获取divdiv.innerText='helloworld'//设置文本内容如果需要修改文字内容为“你好”div.innerText='你好'//设置文本内容声明式:可以理解为面</div> </li> <li><a href="/article/1892344959785299968.htm" title="百度极速版APP 自动脚本 javascript代码" target="_blank">百度极速版APP 自动脚本 javascript代码</a> <span class="text-muted">zaxjb123</span> <a class="tag" taget="_blank" href="/search/dubbo/1.htm">dubbo</a> <div>使用JavaScript编写针对百度极速版APP的自动化脚本通常涉及到使用WebView测试框架,比如Puppeteer或Selenium,这些工具允许你控制一个浏览器或WebView环境,从而与网页或APP中的Web内容进行交互。然而,对于原生APP(如百度极速版)的自动化测试,通常需要使用专门的移动应用自动化框架,如Appium。Appium支持多种编程语言,包括JavaScript。要使用J</div> </li> <li><a href="/article/1892336006464598016.htm" title="27岁大龄转码秋招惨败,朋友劝我转Java来得及吗?还是继续走前端或机器学习?" target="_blank">27岁大龄转码秋招惨败,朋友劝我转Java来得及吗?还是继续走前端或机器学习?</a> <span class="text-muted">程序员yt</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>今天给大家分享的是一位粉丝的提问,27岁大龄转码秋招惨败,朋友劝我转Java来得及吗?还是继续走前端或机器学习?接下来把粉丝的具体提问和我的回复分享给大家,希望也能给一些类似情况的小伙伴一些启发和帮助。同学提问:211建筑本科,22年毕业后gap一年转码去了英国读的QS100的it的水硕(24年12月份毕业),转码后对就业形势认知不足,时间全花在课业上,八股文和算法准备的不充足,秋招算是惨败。读研</div> </li> <li><a href="/article/1892333107923709952.htm" title="JavaScript案例(简易ATM机)" target="_blank">JavaScript案例(简易ATM机)</a> <span class="text-muted">fusheng_cn</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>Documentvarnum=100;do{varoperate=prompt("请输入您需要的操作:\n1.存钱\n2.取钱\n3.显示余额\n4.退出");switch(parseInt(operate)){case1://存钱varmoney1=prompt("请输入您需要存入的钱数:");varsum1=num+parseInt(money1);alert("您的余额为:"+sum1);n</div> </li> <li><a href="/article/1892318611989655552.htm" title="正则表达式regex" target="_blank">正则表达式regex</a> <span class="text-muted">GotoMeiben</span> <a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a> <div>工具网站:RegExr:Learn,Build,&TestRegEx正则表达式(RegularExpression,Regex)是一种强大的字符串匹配工具,广泛用于文本搜索、数据处理和输入验证等场景。无论是Python、Java、JavaScript还是Shell脚本,Regex都是不可或缺的技能。本文将深入介绍正则表达式的各种用法,包括:基本匹配(字母、数字)特殊符号^$\b量词{}*+?字符类</div> </li> <li><a href="/article/1892301695560511488.htm" title="芯麦GC1808立体声ADC芯片解析:高性价比与全集成音频采集方案" target="_blank">芯麦GC1808立体声ADC芯片解析:高性价比与全集成音频采集方案</a> <span class="text-muted">青牛科技-Allen</span> <a class="tag" taget="_blank" href="/search/GLOBALCHIP/1.htm">GLOBALCHIP</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%89%87%E6%9C%BA/1.htm">单片机</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%A1%AC%E4%BB%B6/1.htm">嵌入式硬件</a><a class="tag" taget="_blank" href="/search/%E6%94%B6%E5%BD%95%E6%9C%BA/1.htm">收录机</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E5%AE%B6%E7%94%A8%E7%94%B5%E5%99%A8/1.htm">家用电器</a> <div>引言在直播设备、智能语音终端等新兴应用的推动下,高性能音频采集系统的需求持续增长。芯麦半导体推出的GC1808立体声音频模数转换器,凭借其全集成信号链设计和灵活的接口配置,为开发者提供了高性价比的音频前端解决方案。本文将从核心架构、关键技术特性及典型应用场景三个方面,深入解析这款芯片的设计亮点。一、GC1808核心特性概览全集成信号链内置64倍过采样率Δ-Σ调制器集成数字梳状滤波器(CombFil</div> </li> <li><a href="/article/1892296529092341760.htm" title="前端面试题(HTML篇)" target="_blank">前端面试题(HTML篇)</a> <span class="text-muted">每天一点点~</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>1.网络中使用最多的图片格式有哪些?JPEG,GIF,PNG最流行的是JPEG格式,可以把文件压缩到最小在PS以JPEG格式存储时,提供11级压缩等级2.Doctype作用?严格模式与混杂模式如何区分?它们有何意义?声明文档类型声明位于位于HTML文档中的第一行,处于标签之前DOCTYPE不存在或格式不正确会导致文档以兼容模式呈现。标准模式(严格模式)浏览器按照W3C的标准解析执行代码标准模式(严</div> </li> <li><a href="/article/1892296149751099392.htm" title="python websocket 心跳_websocket心跳及重连机制" target="_blank">python websocket 心跳_websocket心跳及重连机制</a> <span class="text-muted">蜗牛老湿</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/websocket/1.htm">websocket</a><a class="tag" taget="_blank" href="/search/%E5%BF%83%E8%B7%B3/1.htm">心跳</a> <div>websocket心跳及重连机制websocket是前后端交互的长连接,前后端也都可能因为一些情况导致连接失效并且相互之间没有反馈提醒。因此为了保证连接的可持续性和稳定性,websocket心跳重连就应运而生。在使用原生websocket的时候,如果设备网络断开,不会立刻触发websocket的任何事件,前端也就无法得知当前连接是否已经断开。这个时候如果调用websocket.send方法,浏览器</div> </li> <li><a href="/article/1892279125322821632.htm" title="(01)ES6 教程——let与const、解构赋值、Symbol" target="_blank">(01)ES6 教程——let与const、解构赋值、Symbol</a> <span class="text-muted">欲游山河十万里</span> <a class="tag" taget="_blank" href="/search/web%E6%A1%86%E6%9E%B6%E5%AD%A6%E4%B9%A0/1.htm">web框架学习</a><a class="tag" taget="_blank" href="/search/es6/1.htm">es6</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>前言ES6,全称ECMAScript6.0,是JavaScript的下一个版本标准,2015.06发版。ES6主要是为了解决ES5的先天不足,比如JavaScript里并没有类的概念,但是目前浏览器的JavaScript是ES5版本,大多数高版本的浏览器也支持ES6,不过只实现了ES6的部分特性和功能。ECMAScript的背景JavaScript是大家所了解的语言名称,但是这个语言名称是商标(O</div> </li> <li><a href="/article/1892267654920597504.htm" title="Electron学习" target="_blank">Electron学习</a> <span class="text-muted">星空0107</span> <a class="tag" taget="_blank" href="/search/electron/1.htm">electron</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a> <div>Electron的简介Electron基于chromium和Node.js,让我们可以使用Javascript,HTML,CSS构建跨平台的桌面应用程序,同时Electron兼容Mac,Window,和Linux,可以构建出三个平台的应用程序Electron的安装运行cmd,输入npminit,然后一直按enter换行即可输入cnpmielectron-S(如果电脑没有安装cnpm会报错,需要安装</div> </li> <li><a href="/article/1892267275638075392.htm" title="electron学习笔记" target="_blank">electron学习笔记</a> <span class="text-muted">weixin_46452138</span> <a class="tag" taget="_blank" href="/search/electron/1.htm">electron</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>electron个人学习笔记一、electron简单了解Electron是一个跨平台的、基于Web前端技术的桌面GUI应用程序开发框架。可以使用HTML、CSS来绘制界面和控制布局,使用JavaScript来控制用户行为和业务逻辑,使用Node.js来通信、处理音频视频等,几乎所有的Web前端技术和框架(jQuery、Vue、React、Angular等)都可以应用到桌面GUI开发中。二、开发前基</div> </li> <li><a href="/article/75.htm" title="knob UI插件使用" target="_blank">knob UI插件使用</a> <span class="text-muted">换个号韩国红果果</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/jsonp/1.htm">jsonp</a><a class="tag" taget="_blank" href="/search/knob/1.htm">knob</a> <div>图形是用canvas绘制的 js代码 var paras = { max:800, min:100, skin:'tron',//button type thickness:.3,//button width width:'200',//define canvas width.,canvas height displayInput:'tr</div> </li> <li><a href="/article/202.htm" title="Android+Jquery Mobile学习系列(5)-SQLite数据库" target="_blank">Android+Jquery Mobile学习系列(5)-SQLite数据库</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/JQuery+Mobile/1.htm">JQuery Mobile</a> <div>目录导航   SQLite是轻量级的、嵌入式的、关系型数据库,目前已经在iPhone、Android等手机系统中使用,SQLite可移植性好,很容易使用,很小,高效而且可靠。   因为Android已经集成了SQLite,所以开发人员无需引入任何JAR包,而且Android也针对SQLite封装了专属的API,调用起来非常快捷方便。   我也是第一次接触S</div> </li> <li><a href="/article/329.htm" title="impala-2.1.2-CDH5.3.2" target="_blank">impala-2.1.2-CDH5.3.2</a> <span class="text-muted">dayutianfei</span> <a class="tag" taget="_blank" href="/search/impala/1.htm">impala</a> <div>最近在整理impala编译的东西,简单记录几个要点: 根据官网的信息(https://github.com/cloudera/Impala/wiki/How-to-build-Impala): 1. 首次编译impala,推荐使用命令: ${IMPALA_HOME}/buildall.sh -skiptests -build_shared_libs -format 2.仅编译BE ${I</div> </li> <li><a href="/article/456.htm" title="求二进制数中1的个数" target="_blank">求二进制数中1的个数</a> <span class="text-muted">周凡杨</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E4%BA%8C%E8%BF%9B%E5%88%B6/1.htm">二进制</a> <div>解法一: 对于一个正整数如果是偶数,该数的二进制数的最后一位是 0 ,反之若是奇数,则该数的二进制数的最后一位是 1 。因此,可以考虑利用位移、判断奇偶来实现。   public int bitCount(int x){ int count = 0; while(x!=0){ if(x%2!=0){ /</div> </li> <li><a href="/article/583.htm" title="spring中hibernate及事务配置" target="_blank">spring中hibernate及事务配置</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a> <div>hibernate的sessionFactory配置: <!-- hibernate sessionFactory配置 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <</div> </li> <li><a href="/article/710.htm" title="log4j.properties 使用" target="_blank">log4j.properties 使用</a> <span class="text-muted">510888780</span> <a class="tag" taget="_blank" href="/search/log4j/1.htm">log4j</a> <div>log4j.properties 使用 一.参数意义说明 输出级别的种类 ERROR、WARN、INFO、DEBUG ERROR 为严重错误 主要是程序的错误 WARN 为一般警告,比如session丢失 INFO 为一般要显示的信息,比如登录登出 DEBUG 为程序的调试信息 配置日志信息输出目的地 log4j.appender.appenderName = fully.qua</div> </li> <li><a href="/article/837.htm" title="Spring mvc-jfreeChart柱图(2)" target="_blank">Spring mvc-jfreeChart柱图(2)</a> <span class="text-muted">布衣凌宇</span> <a class="tag" taget="_blank" href="/search/jfreechart/1.htm">jfreechart</a> <div>上一篇中生成的图是静态的,这篇将按条件进行搜索,并统计成图表,左面为统计图,右面显示搜索出的结果。 第一步:导包 第二步;配置web.xml(上一篇有代码) 建BarRenderer类用于柱子颜色 import java.awt.Color; import java.awt.Paint; import org.jfree.chart.renderer.category.BarR</div> </li> <li><a href="/article/964.htm" title="我的spring学习笔记14-容器扩展点之PropertyPlaceholderConfigurer" target="_blank">我的spring学习笔记14-容器扩展点之PropertyPlaceholderConfigurer</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/Spring3/1.htm">Spring3</a> <div>PropertyPlaceholderConfigurer是个bean工厂后置处理器的实现,也就是BeanFactoryPostProcessor接口的一个实现。关于BeanFactoryPostProcessor和BeanPostProcessor类似。我会在其他地方介绍。 PropertyPlaceholderConfigurer可以将上下文(配置文件)中的属性值放在另一个单独的标准java</div> </li> <li><a href="/article/1091.htm" title="maven 之 cobertura 简单使用" target="_blank">maven 之 cobertura 简单使用</a> <span class="text-muted">antlove</span> <a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a><a class="tag" taget="_blank" href="/search/test/1.htm">test</a><a class="tag" taget="_blank" href="/search/unit/1.htm">unit</a><a class="tag" taget="_blank" href="/search/cobertura/1.htm">cobertura</a><a class="tag" taget="_blank" href="/search/report/1.htm">report</a> <div>1. 创建一个maven项目 2. 创建com.CoberturaStart.java package com; public class CoberturaStart { public void helloEveryone(){ System.out.println("=================================================</div> </li> <li><a href="/article/1218.htm" title="程序的执行顺序" target="_blank">程序的执行顺序</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/JAVA%E6%89%A7%E8%A1%8C%E9%A1%BA%E5%BA%8F/1.htm">JAVA执行顺序</a> <div>      刚在看java核心技术时发现对java的执行顺序不是很明白了,百度一下也没有找到适合自己的资料,所以就简单的回顾一下吧   代码如下;     经典的程序执行面试题 //关于程序执行的顺序 //例如: //定义一个基类 public class A(){ public A(</div> </li> <li><a href="/article/1345.htm" title="设置session失效的几种方法" target="_blank">设置session失效的几种方法</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/web.xml/1.htm">web.xml</a><a class="tag" taget="_blank" href="/search/session%E5%A4%B1%E6%95%88/1.htm">session失效</a><a class="tag" taget="_blank" href="/search/%E7%9B%91%E5%90%AC%E5%99%A8/1.htm">监听器</a> <div>在系统登录后,都会设置一个当前session失效的时间,以确保在用户长时间不与服务器交互,自动退出登录,销毁session。具体设置很简单,方法有三种:(1)在主页面或者公共页面中加入:session.setMaxInactiveInterval(900);参数900单位是秒,即在没有活动15分钟后,session将失效。这里要注意这个session设置的时间是根据服务器来计算的,而不是客户端。所</div> </li> <li><a href="/article/1472.htm" title="java jvm常用命令工具" target="_blank">java jvm常用命令工具</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a> <div>一.概述         程序运行中经常会遇到各种问题,定位问题时通常需要综合各种信息,如系统日志、堆dump文件、线程dump文件、GC日志等。通过虚拟机监控和诊断工具可以帮忙我们快速获取、分析需要的数据,进而提高问题解决速度。 本文将介绍虚拟机常用监控和问题诊断命令工具的使用方法,主要包含以下工具:       &nbs</div> </li> <li><a href="/article/1599.htm" title="【Spring框架一】Spring常用注解之Autowired和Resource注解" target="_blank">【Spring框架一】Spring常用注解之Autowired和Resource注解</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/Spring%E5%B8%B8%E7%94%A8%E6%B3%A8%E8%A7%A3/1.htm">Spring常用注解</a> <div>Spring自从2.0引入注解的方式取代XML配置的方式来做IOC之后,对Spring一些常用注解的含义行为一直处于比较模糊的状态,写几篇总结下Spring常用的注解。本篇包含的注解有如下几个: Autowired Resource Component Service Controller Transactional 根据它们的功能、目的,可以分为三组,Autow</div> </li> <li><a href="/article/1726.htm" title="mysql 操作遇到safe update mode问题" target="_blank">mysql 操作遇到safe update mode问题</a> <span class="text-muted">bitray</span> <a class="tag" taget="_blank" href="/search/update/1.htm">update</a> <div>    我并不知道出现这个问题的实际原理,只是通过其他朋友的博客,文章得知的一个解决方案,目前先记录一个解决方法,未来要是真了解以后,还会继续补全.     在mysql5中有一个safe update mode,这个模式让sql操作更加安全,据说要求有where条件,防止全表更新操作.如果必须要进行全表操作,我们可以执行 SET</div> </li> <li><a href="/article/1853.htm" title="nginx_perl试用" target="_blank">nginx_perl试用</a> <span class="text-muted">ronin47</span> <a class="tag" taget="_blank" href="/search/nginx_perl%E8%AF%95%E7%94%A8/1.htm">nginx_perl试用</a> <div>因为空闲时间比较多,所以在CPAN上乱翻,看到了nginx_perl这个项目(原名Nginx::Engine),现在托管在github.com上。地址见:https://github.com/zzzcpan/nginx-perl 这个模块的目的,是在nginx内置官方perl模块的基础上,实现一系列异步非阻塞的api。用connector/writer/reader完成类似proxy的功能(这里</div> </li> <li><a href="/article/1980.htm" title="java-63-在字符串中删除特定的字符" target="_blank">java-63-在字符串中删除特定的字符</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div> public class DeleteSpecificChars { /** * Q 63 在字符串中删除特定的字符 * 输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。 * 例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.” */ public static voi</div> </li> <li><a href="/article/2107.htm" title="EffectiveJava--创建和销毁对象" target="_blank">EffectiveJava--创建和销毁对象</a> <span class="text-muted">ccii</span> <a class="tag" taget="_blank" href="/search/%E5%88%9B%E5%BB%BA%E5%92%8C%E9%94%80%E6%AF%81%E5%AF%B9%E8%B1%A1/1.htm">创建和销毁对象</a> <div>本章内容: 1. 考虑用静态工厂方法代替构造器 2. 遇到多个构造器参数时要考虑用构建器(Builder模式) 3. 用私有构造器或者枚举类型强化Singleton属性 4. 通过私有构造器强化不可实例化的能力 5. 避免创建不必要的对象 6. 消除过期的对象引用 7. 避免使用终结方法 1. 考虑用静态工厂方法代替构造器     类可以通过</div> </li> <li><a href="/article/2234.htm" title="[宇宙时代]四边形理论与光速飞行" target="_blank">[宇宙时代]四边形理论与光速飞行</a> <span class="text-muted">comsci</span> <div>   从四边形理论来推论 为什么光子飞船必须获得星光信号才能够进行光速飞行?    一组星体组成星座  向空间辐射一组由复杂星光信号组成的辐射频带,按照四边形-频率假说  一组频率就代表一个时空的入口    那么这种由星光信号组成的辐射频带就代表由这些星体所控制的时空通道,该时空通道在三维空间的投影是一</div> </li> <li><a href="/article/2361.htm" title="ubuntu server下python脚本迁移数据" target="_blank">ubuntu server下python脚本迁移数据</a> <span class="text-muted">cywhoyi</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/Kettle/1.htm">Kettle</a><a class="tag" taget="_blank" href="/search/pymysql/1.htm">pymysql</a><a class="tag" taget="_blank" href="/search/cx_Oracle/1.htm">cx_Oracle</a><a class="tag" taget="_blank" href="/search/ubuntu+server/1.htm">ubuntu server</a> <div>因为是在Ubuntu下,所以安装python、pip、pymysql等都极其方便,sudo apt-get install pymysql, 但是在安装cx_Oracle(连接oracle的模块)出现许多问题,查阅相关资料,发现这边文章能够帮我解决,希望大家少走点弯路。http://www.tbdazhe.com/archives/602 1.安装python 2.安装pip、pymysql</div> </li> <li><a href="/article/2488.htm" title="Ajax正确但是请求不到值解决方案" target="_blank">Ajax正确但是请求不到值解决方案</a> <span class="text-muted">dashuaifu</span> <a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a><a class="tag" taget="_blank" href="/search/async/1.htm">async</a> <div>Ajax正确但是请求不到值解决方案   解决方案:1 .     async: false ,    2.     设置延时执行js里的ajax或者延时后台java方法!!!!!!!   例如:   $.ajax({     &</div> </li> <li><a href="/article/2615.htm" title="windows安装配置php+memcached" target="_blank">windows安装配置php+memcached</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/Install/1.htm">Install</a><a class="tag" taget="_blank" href="/search/memcache/1.htm">memcache</a> <div>Windows下Memcached的安装配置方法 1、将第一个包解压放某个盘下面,比如在c:\memcached。 2、在终端(也即cmd命令界面)下输入 'c:\memcached\memcached.exe -d install' 安装。 3、再输入: 'c:\memcached\memcached.exe -d start' 启动。(需要注意的: 以后memcached将作为windo</div> </li> <li><a href="/article/2742.htm" title="iOS开发学习路径的一些建议" target="_blank">iOS开发学习路径的一些建议</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a> <div>iOS论坛里有朋友要求回答帖子,帖子的标题是: 想学IOS开发高阶一点的东西,从何开始,然后我吧啦吧啦回答写了很多。既然敲了那么多字,我就把我写的回复也贴到博客里来分享,希望能对大家有帮助。欢迎大家也到帖子里讨论和分享,地址:http://bbs.csdn.net/topics/390920759   下面是我回复的内容:   结合自己情况聊下iOS学习建议,</div> </li> <li><a href="/article/2869.htm" title="Javascript闭包概念" target="_blank">Javascript闭包概念</a> <span class="text-muted">fanfanlovey</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/%E9%97%AD%E5%8C%85/1.htm">闭包</a> <div>1.参考资料 http://www.jb51.net/article/24101.htm http://blog.csdn.net/yn49782026/article/details/8549462 2.内容概述 要理解闭包,首先需要理解变量作用域问题 内部函数可以饮用外面全局变量 var n=999;   functio</div> </li> <li><a href="/article/2996.htm" title="yum安装mysql5.6" target="_blank">yum安装mysql5.6</a> <span class="text-muted">haisheng</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>1、安装http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm   2、yum install mysql   3、yum install mysql-server   4、vi /etc/my.cnf   添加character_set_server=utf8</div> </li> <li><a href="/article/3123.htm" title="po/bo/vo/dao/pojo的详介" target="_blank">po/bo/vo/dao/pojo的详介</a> <span class="text-muted">IT_zhlp80</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/BO/1.htm">BO</a><a class="tag" taget="_blank" href="/search/VO/1.htm">VO</a><a class="tag" taget="_blank" href="/search/DAO/1.htm">DAO</a><a class="tag" taget="_blank" href="/search/POJO/1.htm">POJO</a><a class="tag" taget="_blank" href="/search/po/1.htm">po</a> <div>    JAVA几种对象的解释 PO:persistant object持久对象,可以看成是与数据库中的表相映射的java对象。最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合。PO中应该不包含任何对数据库的操作. VO:value object值对象。通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可</div> </li> <li><a href="/article/3250.htm" title="java设计模式" target="_blank">java设计模式</a> <span class="text-muted">kerryg</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a> <div>设计模式的分类:    一、 设计模式总体分为三大类: 1、创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 2、结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。 3、行为型模式(11种):策略模式,模版方法模式,观察者模式,迭代子模式,责任链模式,命令模式,备忘录模式,状态模式,访问者</div> </li> <li><a href="/article/3377.htm" title="[1]CXF3.1整合Spring开发webservice——helloworld篇" target="_blank">[1]CXF3.1整合Spring开发webservice——helloworld篇</a> <span class="text-muted">木头.java</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/webservice/1.htm">webservice</a><a class="tag" taget="_blank" href="/search/CXF/1.htm">CXF</a> <div>Spring 版本3.2.10 CXF 版本3.1.1 项目采用MAVEN组织依赖jar 我这里是有parent的pom,为了简洁明了,我直接把所有的依赖都列一起了,所以都没version,反正上面已经写了版本 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht</div> </li> <li><a href="/article/3504.htm" title="Google 工程师亲授:菜鸟开发者一定要投资的十大目标" target="_blank">Google 工程师亲授:菜鸟开发者一定要投资的十大目标</a> <span class="text-muted">qindongliang1922</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E6%84%9F%E6%82%9F/1.htm">感悟</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E7%94%9F/1.htm">人生</a> <div>身为软件开发者,有什么是一定得投资的? Google 软件工程师 Emanuel Saringan 整理了十项他认为必要的投资,第一项就是身体健康,英文与数学也都是必备能力吗?来看看他怎么说。(以下文字以作者第一人称撰写)) 你的健康 无疑地,软件开发者是世界上最久坐不动的职业之一。 每天连坐八到十六小时,休息时间只有一点点,绝对会让你的鲔鱼肚肆无忌惮的生长。肥胖容易扩大罹患其他疾病的风险,</div> </li> <li><a href="/article/3631.htm" title="linux打开最大文件数量1,048,576" target="_blank">linux打开最大文件数量1,048,576</a> <span class="text-muted">tianzhihehe</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>File descriptors are represented by the C int type. Not using a special type is often  considered odd, but is, historically, the Unix way. Each Linux process has a maximum number of files th</div> </li> <li><a href="/article/3758.htm" title="java语言中PO、VO、DAO、BO、POJO几种对象的解释" target="_blank">java语言中PO、VO、DAO、BO、POJO几种对象的解释</a> <span class="text-muted">衞酆夼</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/VO/1.htm">VO</a><a class="tag" taget="_blank" href="/search/BO/1.htm">BO</a><a class="tag" taget="_blank" href="/search/POJO/1.htm">POJO</a><a class="tag" taget="_blank" href="/search/po/1.htm">po</a> <div>PO:persistant object持久对象 最形象的理解就是一个PO就是数据库中的一条记录。好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象。可以看成是与数据库中的表相映射的java对象。最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合。PO中应该不包含任何对数据库的操作。 BO:business object业务对象 封装业务逻辑的java对象</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>