React测试相关

最近在写业务代码测试时候,对如何写规范的测试产生了兴趣,下面是一点学习心得。

React组件测试

React组件的测试,选择的测试工具一般是官方测试工具库和Enzyme。
React组件有两种存在方式:虚拟DOM对象和真是DOM节点。针对这两种形式,官方测试工具库对这两种方式,有不同测试API。

 shallow rendering: 测试虚拟DOM
 DOM rendering: 测试真实DOM

Enzyme库shallow,render和mount方法

Enzyme 是 Airbnb 开源的专为 React 服务的测试框架。

shallow方法是对官方测试工具库Shallow Rendering的封装。Shallow Rendering是将一个组件渲染成虚拟DOM,并且只渲染第一层,不渲染子组件,所以渲染速度很快。优点:渲染速度快。

render方法将组件解析为一段静态HTML字符串。

mount方法将组件完全解析成真实DOM结构。

为什么要写单元测试

保障质量,方便重构,避免需求增加后,代码腐化。

什么是好的单元测试

测试一般遵循give-when-then 的结构,这样写出的测试代码结构清晰,易于理解。
比如

// production code
const computeTotalAmount = (products) => {
  return products.reduce((total, product) => total + product.price, 0); 
}

// testing code
it('should return summed up total amount 1000 when there are three products priced 200, 300, 500', () => {
  // given - 准备数据
  const products = [
    { name: 'nike', price: 200 },
    { name: 'adidas', price: 300 },
    { name: 'lining', price: 500 },
  ]

  // when - 调用被测函数
  const result = computeTotalAmount(products)

  // then - 断言结果
  expect(result).toBe(1000)
})

好的测试的几条原则

  • 只关注输入输出,不关注内部实现
    简单来说,就是只要测试输入不变,输出也不变。这是重构的基础。因为重构的定义是在不改变软件外部可观测行为的基础上,调整软件内部的实现。
    对于去mock外部依赖,其实也是关注内部实现。因为mock失败了,测试也会挂,但其实并不是真实业务逻辑出问题了,建议少用mock。

  • 只测试一条分支
    简单来说,就是只测试一个业务场景,对应在任务拆解中一个细粒度的task,这样做的好处是轻量,写起来快,可以给测试一个很详细的描述。

  • 表达力极强

  1. 测试描述,当遵循只测试一条分支原则时,一般测试描述就能给出具体的业务上下文,这样看测试的人,通过测试就能获取一些业务的导入。
  2. 测试数据,测试数据不应该包含与本次测试无关的数据,只准备满足所测场景的最小数据。
  3. 清晰的断言,测试失败时候,能给出期望的数据与实际数据具体差异。
  • 测试不包含逻辑
    一般模式都是:准备数据->调用函数->断言。如果包含了逻辑,一是增加了阅读负担,而是测试挂了,不知道是实现挂了,还是测试本身挂了。

  • 运行速度快
    只有单元测试运行快,他才是快速获取反馈的一种手段。
    如何才能尽量让测试运行更快,有一些策略:
    1.把耗时的操作能不能挪到更高层级的测试中,比如与第三方系统集成。
    2.尽可能避免依赖。

React component测试

React component的拆分应遵循单一职责,分为以下几类:

  • 通用UI组件
  • 功能组件
  • 展示型业务组件
  • 容器型业务组件

功能型组件,指的是跟业务无关的另一类组件,它是功能型的,更像是底层支撑着业务组件运作的基础组件,比如路由组件、分页组件等。这些组件一般逻辑多一点,UI 部分少一些。
组件的测试一般遵循 shallow -> find(Component) -> 断言的三段式
那React component应该测什么,不该测什么?

  • 分支渲染逻辑必须侧
  • 事件调用和参数传递必须侧
  • 渲染出来的UI一般不放在单元测试
    因为分支渲染和事件调用,有业务价值和文档作用。添加测试能方便重构,也能做文档参考。
    单元测试一般不测纯UI,因为去获取一些DOM节点,不好加断言,写测试成本较高。UI测试一般由自动化测试监控,比如可以用backstopjs去做image compare

举个例子

  1. 业务组件-分支渲染测试
export const CommentsSection = ({ comments }) => (
  
{comments.length > 0 && (

Comments

)} {comments.map((comment) => ( )}
)

第一个测试用例是,如果没有comment,则不渲染comment header和comment内容

import { CommentsSection } from './index'
import { Comment } from './Comment'

test('should not render a header and any comment sections when there is no comments', () => {
  const component = shallow()

  const header = component.find('h2')
  const comments = component.find(Comment)

  expect(header).toHaveLength(0)
  expect(comments).toHaveLength(0)
})

第二个测试用例,如果有comment,则正确渲染comment header和comment内容

test('should render a comments section and a header when there are comments', () => {
  const contents = [
    { id: 1, author: 'test user 1', comment: 'test comment 1' },
    { id: 2, author: 'test user 2', comment: 'test comment 1' },
  ]
  const component = shallow()

  const header = component.find('h2')
  const comments = component.find(Comment)

  expect(header.html()).toBe('Comments')
  expect(comments).toHaveLength(2)
})

2.业务组件-事件调用
测试场景是:当某条产品被点击时,应该将产品相关的信息发送给埋点系统进行埋点。

export const ProductItem = ({
  id,
  productName,
  introduction,
  trackPressEvent,
}) => (
   trackPressEvent(id, productName)}>
    
      
      <Introduction introduction={introduction} />
    </View>
  </TouchableWithoutFeedback>
)
</code></pre> 
 <p>测试内容:模拟产品点击事件,相关函数被调用,并能传递正确的参数。</p> 
 <pre><code>import { ProductItem } from './index'

test(`
  should send product id and name to analytics system 
  when user press the product item
`, () => {
  const trackPressEvent = jest.fn()
  const component = shallow(
    <productitem id={100832}
      introduction="iMac Pro - Power to the pro."
      trackPressEvent={trackPressEvent}></productitem>
  )

  component.find(TouchableWithoutFeedback).simulate('press')

  expect(trackPressEvent).toHaveBeenCalledWith(
    100832,
    'iMac Pro - Power to the pro.'
  )
})
</code></pre> 
 <p>可以发现,这些测试还是依赖了一些组件内部实现,比如find TouchableWithoutFeedback组件,这些无法避免。因为组件本质是渲染树,要获取点击节点,必须通过组件名,className等选择器。测试时尽量少暴露组件细节。</p> 
 <h2>对纯函数可以用参数化测试</h2> 
 <p>纯函数就是一个输入对应固定的输出,没有任何外部依赖。<br> 比如</p> 
 <pre><code>test.each([
    ['abc@hotmail.com', true, 'should return true given correct toEmail format'],
    ['abc@hotmail.com,um_agt@outlook.com', true, 'should return true given correct toEmail format'],
    ['abc,abc@hotmail.com', false, 'should return false given wrong toEmail format'],
    ['abc@hotmail.com,abc@hotmail.,um_agt@outlook.com', false, 'should return false given wrong toEmail format'],
  ])(
      'should return correct boolean value given email address',
      (expected, input, description) => {
        expect(isCorrectEmailFormat(input)).toEqual(expected)
      }
  )
</code></pre> 
 <p>参数化测试方便准备数据,测试用例在一个地方,清晰易读。</p> 
</article>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1633724482977849344"></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">你可能感兴趣的:(React测试相关)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1835492740536823808.htm"
                           title="node.js学习" target="_blank">node.js学习</a>
                        <span class="text-muted">小猿L</span>
<a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/vim/1.htm">vim</a>
                        <div>node.js学习实操及笔记温故node.js,node.js学习实操过程及笔记~node.js学习视频node.js官网node.js中文网实操笔记githubcsdn笔记为什么学node.js可以让别人访问我们编写的网页为后续的框架学习打下基础,三大框架vuereactangular离不开node.jsnode.js是什么官网:node.js是一个开源的、跨平台的运行JavaScript的运行</div>
                    </li>
                    <li><a href="/article/1835448111909138432.htm"
                           title="react-intl——react国际化使用方案" target="_blank">react-intl——react国际化使用方案</a>
                        <span class="text-muted">苹果酱0567</span>
<a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95%E9%A2%98%E6%B1%87%E6%80%BB%E4%B8%8E%E8%A7%A3%E6%9E%90/1.htm">面试题汇总与解析</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</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/%E4%B8%AD%E9%97%B4%E4%BB%B6/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>
                        <div>国际化介绍i18n:internationalization国家化简称,首字母+首尾字母间隔的字母个数+尾字母,类似的还有k8s(Kubernetes)React-intl是React中最受欢迎的库。使用步骤安装#usenpmnpminstallreact-intl-D#useyarn项目入口文件配置//index.tsximportReactfrom"react";importReactDOMf</div>
                    </li>
                    <li><a href="/article/1835411044768509952.htm"
                           title="字节二面" target="_blank">字节二面</a>
                        <span class="text-muted">Redstone Monstrosity</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a>
                        <div>1.假设你是正在面试前端开发工程师的候选人,面试官让你详细说出你上一段实习过程的收获和感悟。在上一段实习过程中,我获得了宝贵的实践经验和深刻的行业洞察,以下是我的主要收获和感悟:一、专业技能提升框架应用熟练度:通过实际项目,我深入掌握了React、Vue等前端框架的使用,不仅提升了编码效率,还学会了如何根据项目需求选择合适的框架。问题解决能力:在实习期间,我遇到了许多预料之外的技术难题。通过查阅文</div>
                    </li>
                    <li><a href="/article/1835398064727224320.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/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>点击上传文件import{ElNotification}from'element-plus'import{API_CONFIG}from'../config/index.js'import{UploadFilled}from'@element-plus/icons-vue'import{reactive}from'vue'import{BASE_URL}from'../config/index'i</div>
                    </li>
                    <li><a href="/article/1835133874892533760.htm"
                           title="前端使用react-intl-universal进行国际化" target="_blank">前端使用react-intl-universal进行国际化</a>
                        <span class="text-muted">Stephy_Yy</span>
<a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/%E8%B0%83%E7%A0%94/1.htm">调研</a><a class="tag" taget="_blank" href="/search/reactjs/1.htm">reactjs</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a>
                        <div>一、国际化/i18n目前国际化,就是开发者写对象,一个key关联若干语种的翻译。相比于浏览器自带的翻译功能,语义更加准确。“国际化”的简称:i18n(其来源是英文单词internationalization的首末字符i和n,18为中间的字符数)二、react项目国际化react-intl是业界最受欢迎的软件包之一:React-intl是雅虎的语言国际化开源项目FormatJS的一部分,通过其提供的</div>
                    </li>
                    <li><a href="/article/1835101722159181824.htm"
                           title="VUE实现大小缩放轮播图" target="_blank">VUE实现大小缩放轮播图</a>
                        <span class="text-muted">书边事.</span>
<a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</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>效果图import{ref,computed,reactive,watch,onMounted}from'vue';exportdefault{props:{/***轮播数据来源*/source:{type:Array,default:()=>[{img:require('@/assets/imgs/test/1.png')},{img:require('@/assets/imgs/test/1.</div>
                    </li>
                    <li><a href="/article/1835089183857799168.htm"
                           title="react里的index.js是怎么跟index.html结合起来的?" target="_blank">react里的index.js是怎么跟index.html结合起来的?</a>
                        <span class="text-muted">SherrinfordL</span>

                        <div>image.pngcreate-react-app把webpack、babel等配置都封装到了依赖项目react-script中,所以你无法直观的看到这些配置。你可以在项目下运行npmruneject,被隐藏的配置文件就会暴露到项目根路径下。把请求转发到index.html原因是,你执行npmrunstart时,启动的webpack-dev-server,会加载react-script项目conf</div>
                    </li>
                    <li><a href="/article/1835085841114951680.htm"
                           title="Taro实现微信小程序自定义拍照截图识别" target="_blank">Taro实现微信小程序自定义拍照截图识别</a>
                        <span class="text-muted">书边事.</span>
<a class="tag" taget="_blank" href="/search/taro/1.htm">taro</a><a class="tag" taget="_blank" href="/search/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">微信小程序</a><a class="tag" taget="_blank" href="/search/%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">小程序</a>
                        <div>效果图:代码:>请对准框内拍摄题目重新拍照文件处理中...开始识别definePageConfig({navigationStyle:"custom",navigationBarTitleText:"",//启用页面分享//enableShareAppMessage:true,//启动朋友圈分享//enableShareTimeline:true});import{reactive,toRefs,</div>
                    </li>
                    <li><a href="/article/1835053432449363968.htm"
                           title="(小白入门)Windows环境下搭建React Native Android开发环境" target="_blank">(小白入门)Windows环境下搭建React Native Android开发环境</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/React/1.htm">React</a><a class="tag" taget="_blank" href="/search/Native/1.htm">Native</a><a class="tag" taget="_blank" href="/search/%E7%A7%BB%E5%8A%A8%E5%BC%80%E5%8F%91/1.htm">移动开发</a><a class="tag" taget="_blank" href="/search/Android/1.htm">Android</a><a class="tag" taget="_blank" href="/search/studio/1.htm">studio</a>
                        <div>ReactNative(简称RN)是Facebook于2015年4月开源的跨平台移动应用开发框架,是Facebook早先开源的UI框架React在原生移动应用平台的衍生产物,目前支持iOS和Android两大平台。RN的环境搭建在RN的中文社区有所介绍,但是对于小白来说还是有些太过简略了。RN中文社区详见参考,本文不涉及的问题也许在其中能够有所解答。ReactNative思想底层引擎是JavaSc</div>
                    </li>
                    <li><a href="/article/1834965176286277632.htm"
                           title="react中如何获取并使用usestate声明的变量的值" target="_blank">react中如何获取并使用usestate声明的变量的值</a>
                        <span class="text-muted">小华0000</span>
<a class="tag" taget="_blank" href="/search/react.js/1.htm">react.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>
                        <div>1.函数式更新当需要根据当前状态来更新状态时,可以使用函数式更新。setState(在类组件中)和setCount(在useState中)都可以接受一个函数作为参数,这个函数接收当前的状态作为参数,并返回新的状态。functionExampleComponent(){const[count,setCount]=useState(0);//使用函数式更新functionhandleClick(){s</div>
                    </li>
                    <li><a href="/article/1834963412711469056.htm"
                           title="【Vue3源码实现】Ref isRef unRef proxyRefs实现" target="_blank">【Vue3源码实现】Ref isRef unRef proxyRefs实现</a>
                        <span class="text-muted">ZhaiMou</span>
<a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.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/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><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%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>前言在上篇文章中我们了解了响应式原理,并在最后实现了reactive。上文链接Vue3响应式原理实现与track和trigger依赖收集和触发依赖在我们的日常业务中,我们有可能需要将一个基础数据类型的值也转换成响应式的,而reactive只能代理对象,我们需要对基础数据类型的值也进行读写操作的拦截,但Proxy无法实现对基础数据类型值读写操作的拦截。所以Vue设计了Ref,以及相关api本篇文章实</div>
                    </li>
                    <li><a href="/article/1834963034653683712.htm"
                           title="React 前端应用结合 Nginx 部署指南及常见错误排查" target="_blank">React 前端应用结合 Nginx 部署指南及常见错误排查</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/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a>
                        <div>在现代Web开发中,React已成为构建用户界面的流行选择,而Nginx则是一个高性能的Web服务器,广泛用于静态文件的托管和负载均衡。在本篇博客中,我们将详细介绍如何将一个React应用部署到Nginx上,并探讨在部署过程中可能遇到的常见错误及其解决方案。部署步骤1.准备React应用首先,确保你已经创建了一个React应用。如果还没有,可以使用CreateReactApp快速生成一个基础项目:</div>
                    </li>
                    <li><a href="/article/1834961772746993664.htm"
                           title="vue3 响应性API" target="_blank">vue3 响应性API</a>
                        <span class="text-muted">weixin_44747590</span>
<a class="tag" taget="_blank" href="/search/vue3/1.htm">vue3</a><a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a><a class="tag" taget="_blank" href="/search/js/1.htm">js</a>
                        <div>toRef可以用来为源响应式对象上的property性创建一个ref。然后可以将ref传递出去,从而保持对其源property的响应式连接。本质类似指针引用。举例:conststate=reactive({foo:1,bar:2})constfooRef=toRef(state,'foo')fooRef.value++console.log(state.foo)//2state.foo++cons</div>
                    </li>
                    <li><a href="/article/1834957860375719936.htm"
                           title="手撸vue3核心源码——响应式原理(isRef和unRef)" target="_blank">手撸vue3核心源码——响应式原理(isRef和unRef)</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/vue.js/1.htm">vue.js</a>
                        <div>今天来实现一下ref的功能函数,isRef与unRefisRefisRef和isReactive一样,都是用于检测数据类型,isRef是检测是不是一个ref对象,跟isReactive函数实现起来一样,我们先来写一个单元测试这里要实现的功能是,检测ref对象肯定就通过返回true,检测普通类型数据以及reactive对象都是falseit("itshouldreturnaboolean",()=></div>
                    </li>
                    <li><a href="/article/1834957104239177728.htm"
                           title="vue3 | isRef、unref、toRef、toRefs" target="_blank">vue3 | isRef、unref、toRef、toRefs</a>
                        <span class="text-muted">杨贵妃会飞飞飞</span>
<a class="tag" taget="_blank" href="/search/Vue/1.htm">Vue</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>isRef检查某个值是否是ref。是返回true,否则返回false。constnum=ref(10)constnum1=20constnum2=reactive({data:30})console.log(isRef(num))//trueconsole.log(isRef(num1))//falseconsole.log(isRef(num2))//falseunref()如果参数是ref,则</div>
                    </li>
                    <li><a href="/article/1834953567916617728.htm"
                           title="vue学习笔记——关于对Vue3 ref(), toRef(), toRefs(), unref(), isRef(), reactive()方法的理解。" target="_blank">vue学习笔记——关于对Vue3 ref(), toRef(), toRefs(), unref(), isRef(), reactive()方法的理解。</a>
                        <span class="text-muted">chen_sir_sh</span>
<a class="tag" taget="_blank" href="/search/vue%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">vue学习笔记</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/vue/1.htm">vue</a>
                        <div>VUE3出现了很多新的API,下面是自己的一些理解进行的总结。欢迎大家一起交流补充。ref()使用ref创建一个数据类型,ref有value这个属性constname1={age:"14",name:"bob1"};constname2=ref({name:"bob2"});//使用ref创建一个数据类型相对于reactive,ref有value属性name2.value="bob3"consol</div>
                    </li>
                    <li><a href="/article/1834951677422170112.htm"
                           title="React项目的开发前准备 以及 JSX 的基本使用" target="_blank">React项目的开发前准备 以及 JSX 的基本使用</a>
                        <span class="text-muted">渡鸦七</span>
<a class="tag" taget="_blank" href="/search/React/1.htm">React</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</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%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a>
                        <div>React项目的开发前准备以及JSX的基本使用React项目创建create-react-appnpxcreate-react-appmy-appcdmy-appnpmstartyarncreatereact-appyarncreatereact-appmy-appcdmy-appyarnstartcreate-react-app和yarncreatereact-app都可以快速创建一个React</div>
                    </li>
                    <li><a href="/article/1834950166029889536.htm"
                           title="react 函数组件useState异步变同步" target="_blank">react 函数组件useState异步变同步</a>
                        <span class="text-muted">MIKE-zi</span>
<a class="tag" taget="_blank" href="/search/react%E5%85%A5%E9%97%A8/1.htm">react入门</a><a class="tag" taget="_blank" href="/search/setstate%E5%BC%82%E6%AD%A5%E9%97%AE%E9%A2%98/1.htm">setstate异步问题</a><a class="tag" taget="_blank" href="/search/%E5%87%BD%E6%95%B0%E7%BB%84%E4%BB%B6%E5%AE%9E%E7%8E%B0%E5%88%86%E9%A1%B5/1.htm">函数组件实现分页</a><a class="tag" taget="_blank" href="/search/%E5%87%BD%E6%95%B0%E7%BB%84%E4%BB%B6%E4%B8%8A%E6%8B%89%E5%8A%A0%E8%BD%BD/1.htm">函数组件上拉加载</a>
                        <div>需求函数组件实现一个下拉上拉的列表,列表支持分页。最开始我们使用setstate的方式去报错当前页数。这样做的问题,就是有一个异步的延迟。上代码const[pageNo,setpageNo]=useState(1)constonPullUpRefresh=()=>{console.log("上拉加载内容")console.log("上一次的pageNo",pageNo)setpageNo(page</div>
                    </li>
                    <li><a href="/article/1834844033856401408.htm"
                           title="Netty权威指南:Netty总结-高性能与可靠性" target="_blank">Netty权威指南:Netty总结-高性能与可靠性</a>
                        <span class="text-muted">Ty_1106</span>
<a class="tag" taget="_blank" href="/search/Netty/1.htm">Netty</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/rpc/1.htm">rpc</a>
                        <div>第二十二章高性能之道22.1RPC调用性能模型分析22.1.1传统RPC调用性能差三宗罪:网络传输采用同步阻塞I/O导致经常性阻塞序列化性能差线程模型问题22.1.2I/O通信性能三要素传输:BIO、NIO或者AIO协议:HTTP公有协议,内部私有协议线程:数据报如何读取,Reactor线程模型22.2Netty高性能之道22.2.1异步非阻塞通信I/O多路复用技术22.2.2高效的Reactor</div>
                    </li>
                    <li><a href="/article/1834835713846243328.htm"
                           title="Vue 和 React 的对比" target="_blank">Vue 和 React 的对比</a>
                        <span class="text-muted">淘淘是只狗</span>
<a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a><a class="tag" taget="_blank" href="/search/React/1.htm">React</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a>
                        <div>React和Vue有许多相似之处:使用VirtualDOM提供了响应式(Reactive)和组件化(Composable)的视图组件。将注意力集中保持在核心库,而将其他功能如路由和全局状态管理交给相关的库。运行时性能React在React应用中,当某个组件的状态发生变化时,它会以该组件为根,重新渲染整个组件子树。如要避免不必要的子组件的重渲染,你需要在所有可能的地方使用PureComponent,</div>
                    </li>
                    <li><a href="/article/1834832435699871744.htm"
                           title="一文让你彻底弄懂Redux的基本原理以及其如何在React中使用!" target="_blank">一文让你彻底弄懂Redux的基本原理以及其如何在React中使用!</a>
                        <span class="text-muted">tabzzz</span>
<a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</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>文章目录什么是Redux?它有什么用Redux基本原理Redux在React中具体使用的方法ReduxToolkit(RTK)createSlice函数参数返回值示例configureStore函数参数返回值示例React-ReduxProvider组件示例React组件使用store中的数据useSelector钩子函数示例connect组件mapStateToPropsmapDispatchT</div>
                    </li>
                    <li><a href="/article/1834831738988228608.htm"
                           title="react 更新元素状态" target="_blank">react 更新元素状态</a>
                        <span class="text-muted">叶绿素yls</span>

                        <div>所有的react元素都是immutable不可变的。当元素被创建之后,我们无法修改他的内容或属性。根据我们现在所学的react的知识,我们要更新元素的内容,我们必须重新渲染这个元素,也就是重新创建这个元素。看一个例子:functiontick(){constelement=Hello,worldItis{newDate().toLocaleString()}.;ReactDOM.render(el</div>
                    </li>
                    <li><a href="/article/1834817300432252928.htm"
                           title="Reactive 编程-Vert.x" target="_blank">Reactive 编程-Vert.x</a>
                        <span class="text-muted">Flying_Fish_Xuan</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>Reactive编程与Vert.x:高效异步Java微服务框架一、什么是Reactive编程?Reactive编程是一种异步编程范式,专注于数据流和事件的传播处理。与传统的阻塞式编程不同,Reactive编程能够更好地处理高并发和异步操作,特别适合实时系统、流处理以及需要快速响应的场景。Reactive编程的核心原则包括:响应性(Responsive):系统能够快速响应用户请求,并保持低延迟。弹性</div>
                    </li>
                    <li><a href="/article/1834793357197537280.htm"
                           title="生成一个完整的App代码通常不会仅仅通过单一的文件或几种语言的简单组合来完成,因为App的开发涉及前端用户界面、后端逻辑处理、数据库管理以及可能的第三方服务集成等多个方面。不过,我可以为你提供一个概念" target="_blank">生成一个完整的App代码通常不会仅仅通过单一的文件或几种语言的简单组合来完成,因为App的开发涉及前端用户界面、后端逻辑处理、数据库管理以及可能的第三方服务集成等多个方面。不过,我可以为你提供一个概念</a>
                        <span class="text-muted">NewmanEdwarda2</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a>
                        <div>前端(用户界面)yinanjinying.comHTML/CSS/JavaScript(原生Web开发)对于简单的WebApp,你可以直接使用HTML来构建页面结构,CSS来设置样式,JavaScript来添加交互性。React(JavaScript/TypeScript)对于更复杂的单页应用(SPA),React是一个流行的选择。它允许你构建可复用的UI组件。Flutter(Dart)如果你想要</div>
                    </li>
                    <li><a href="/article/1834722761373741056.htm"
                           title="react native ScrollView实现滑动锚定,滑动到指定位置" target="_blank">react native ScrollView实现滑动锚定,滑动到指定位置</a>
                        <span class="text-muted">君君yui</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/react/1.htm">react</a><a class="tag" taget="_blank" href="/search/native/1.htm">native</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a>
                        <div>实现ScrollView滑动视图组件滑动到指定位置,实现tab与具体位置相锚定给需要锚定的组件加上onLayout属性//event.nativeEvent.layout.x是水平方向值,event.nativeEvent.layout.y是数值方向值//this.layoutList用于存储组件位置onLayout={(event)=>{this.layoutList.push(event.na</div>
                    </li>
                    <li><a href="/article/1834722508675313664.htm"
                           title="reactnative 获取定位_React-native实现定位的功能" target="_blank">reactnative 获取定位_React-native实现定位的功能</a>
                        <span class="text-muted">weixin_39644915</span>
<a class="tag" taget="_blank" href="/search/reactnative/1.htm">reactnative</a><a class="tag" taget="_blank" href="/search/%E8%8E%B7%E5%8F%96%E5%AE%9A%E4%BD%8D/1.htm">获取定位</a>
                        <div>1、在React-native中实现定位的功能的几种方式。(1).使用rn中的自带的Geolocation实现定位。(2).用第三放库react-native-location实现定位。2.用rn中自带的Geolocation实现定位的详细步骤:(1).如果是android进行定位手下是需要权限的通过以下代码设置权限:(2).直接通过navigator.geolocation来进行定位,示例代码如</div>
                    </li>
                    <li><a href="/article/1834711914299617280.htm"
                           title="React Native动画的锚点anchorPoint" target="_blank">React Native动画的锚点anchorPoint</a>
                        <span class="text-muted">沉默的依恋</span>
<a class="tag" taget="_blank" href="/search/React/1.htm">React</a><a class="tag" taget="_blank" href="/search/Native/1.htm">Native</a>
                        <div>在RN动画开发的过程中,有需求让图片绕中心点以外的其它点旋转,本以为是一个简单的问题,猜想Facebook应该有提供类似的API.然而在官网找了一圈没有anchorPoint这个API,后来想了想,RN与H5非常像,应该有transformOrigin这个属性,然而,还是没有,在github的issues中有人提问过什么时候更新这个属性,但是官网仍旧没有计划;为了达到这种效果,其实有一种间接的方法</div>
                    </li>
                    <li><a href="/article/1834705361693667328.htm"
                           title="基于react native的锚点" target="_blank">基于react native的锚点</a>
                        <span class="text-muted">miao_zz</span>
<a class="tag" taget="_blank" href="/search/React/1.htm">React</a><a class="tag" taget="_blank" href="/search/react-native/1.htm">react-native</a><a class="tag" taget="_blank" href="/search/react/1.htm">react</a><a class="tag" taget="_blank" href="/search/native/1.htm">native</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a>
                        <div>基于reactnative的锚点效果示例图示例代码效果示例图示例代码/*eslint-disablereact-native/no-inline-styles*/importReact,{useEffect,useRef,useState}from'react';import{Image,ImageBackground,ScrollView,StyleSheet,Text,TouchableOpa</div>
                    </li>
                    <li><a href="/article/1834673478599536640.htm"
                           title="vue2与vue3的区别" target="_blank">vue2与vue3的区别</a>
                        <span class="text-muted">longfan_</span>
<a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a>
                        <div>1.vue2和vue3响应式原理发生了改变vue2的响应式原理是利⽤es5的⼀个API,Object.defineProperty()对数据进⾏劫持结合发布订阅模式的⽅式来实现的。vue3中使⽤了es6的proxyAPI对数据代理,通过reactive()函数给每⼀个对象都包⼀层Proxy,通过Proxy监听属性的变化,从⽽实现对数据的监控。这⾥是引相⽐于vue2版本,使⽤proxy的优势如下1.</div>
                    </li>
                    <li><a href="/article/1834617504568274944.htm"
                           title="前后端分离,Asp.net core webapi 如何配置跨域" target="_blank">前后端分离,Asp.net core webapi 如何配置跨域</a>
                        <span class="text-muted">代码掌控者</span>
<a class="tag" taget="_blank" href="/search/C%23/1.htm">C#</a><a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</a><a class="tag" taget="_blank" href="/search/core/1.htm">core</a><a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a><a class="tag" taget="_blank" href="/search/core/1.htm">core</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a><a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a>
                        <div>前言可以说,前后端分离已经成为当今信息系统项目开发的主流软件架构模式,微服务的出现,让前后端分离发展更是迅速,大量优秀的前端框架如vue.js、react的出现,也让前后端分离趋势加快。所谓的前后端分离软件架构模式,就是指将前端和后端的开发完全分离,后端负责提供API接口和数据处理,而前端通过各种现代的JavaScript技术如AJAX或者Fetch等,来调用后端提供的API接口获取数据,从而构建</div>
                    </li>
                                <li><a href="/article/71.htm"
                                       title="Linux的Initrd机制" target="_blank">Linux的Initrd机制</a>
                                    <span class="text-muted">被触发</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                                    <div>Linux 的 initrd 技术是一个非常普遍使用的机制,linux2.6 内核的 initrd 的文件格式由原来的文件系统镜像文件转变成了 cpio 格式,变化不仅反映在文件格式上, linux 内核对这两种格式的 initrd 的处理有着截然的不同。本文首先介绍了什么是 initrd 技术,然后分别介绍了 Linux2.4 内核和 2.6 内核的 initrd 的处理流程。最后通过对 Lin</div>
                                </li>
                                <li><a href="/article/198.htm"
                                       title="maven本地仓库路径修改" target="_blank">maven本地仓库路径修改</a>
                                    <span class="text-muted">bitcarter</span>
<a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a>
                                    <div>默认maven本地仓库路径:C:\Users\Administrator\.m2 
 
修改maven本地仓库路径方法: 
    
1.打开E:\maven\apache-maven-2.2.1\conf\settings.xml 
    
2.找到 
       </div>
                                </li>
                                <li><a href="/article/325.htm"
                                       title="XSD和XML中的命名空间" target="_blank">XSD和XML中的命名空间</a>
                                    <span class="text-muted">darrenzhu</span>
<a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/xsd/1.htm">xsd</a><a class="tag" taget="_blank" href="/search/schema/1.htm">schema</a><a class="tag" taget="_blank" href="/search/namespace/1.htm">namespace</a><a class="tag" taget="_blank" href="/search/%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4/1.htm">命名空间</a>
                                    <div>http://www.360doc.com/content/12/0418/10/9437165_204585479.shtml 

http://blog.csdn.net/wanghuan203/article/details/9203621 

http://blog.csdn.net/wanghuan203/article/details/9204337 
 

http://www.cn</div>
                                </li>
                                <li><a href="/article/452.htm"
                                       title="Java 求素数运算" target="_blank">Java 求素数运算</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/%E7%B4%A0%E6%95%B0/1.htm">素数</a>
                                    <div>网络上对求素数之解数不胜数,我在此总结归纳一下,同时对一些编码,加以改进,效率有成倍热提高。   
第一种:    
  
原理: 6N(+-)1法              任何一个自然数,总可以表示成为如下的形式之一: 6N,6N+1,6N+2,6N+3,6N+4,6N+5 (N=0,1,2,…)    </div>
                                </li>
                                <li><a href="/article/579.htm"
                                       title="java 单例模式" target="_blank">java 单例模式</a>
                                    <span class="text-muted">g21121</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>想必单例模式大家都不会陌生,有如下两种方式来实现单例模式: 
  
class Singleton {
  private static Singleton instance=new Singleton();
  private Singleton(){}
  static Singleton getInstance() {
      return instance;
  }</div>
                                </li>
                                <li><a href="/article/706.htm"
                                       title="Linux下Mysql源码安装" target="_blank">Linux下Mysql源码安装</a>
                                    <span class="text-muted">510888780</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a>
                                    <div>1.假设已经有mysql-5.6.23-linux-glibc2.5-x86_64.tar.gz 
 
(1)创建mysql的安装目录及数据库存放目录       
解压缩下载的源码包,目录结构,特殊指定的目录除外: 
          </div>
                                </li>
                                <li><a href="/article/833.htm"
                                       title="32位和64位操作系统" target="_blank">32位和64位操作系统</a>
                                    <span class="text-muted">墙头上一根草</span>
<a class="tag" taget="_blank" href="/search/32%E4%BD%8D%E5%92%8C64%E4%BD%8D%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/1.htm">32位和64位操作系统</a>
                                    <div>32位和64位操作系统是指:CPU一次处理数据的能力是32位还是64位。现在市场上的CPU一般都是64位的,但是这些CPU并不是真正意义上的64 位CPU,里面依然保留了大部分32位的技术,只是进行了部分64位的改进。32位和64位的区别还涉及了内存的寻址方面,32位系统的最大寻址空间是2 的32次方= 4294967296(bit)= 4(GB)左右,而64位系统的最大寻址空间的寻址空间则达到了</div>
                                </li>
                                <li><a href="/article/960.htm"
                                       title="我的spring学习笔记10-轻量级_Spring框架" target="_blank">我的spring学习笔记10-轻量级_Spring框架</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/Spring+3/1.htm">Spring 3</a>
                                    <div>一、问题提问: 
 
    → 请简单介绍一下什么是轻量级? 
 
    轻量级(Leightweight)是相对于一些重量级的容器来说的,比如Spring的核心是一个轻量级的容器,Spring的核心包在文件容量上只有不到1M大小,使用Spring核心包所需要的资源也是很少的,您甚至可以在小型设备中使用Spring。 
 
 </div>
                                </li>
                                <li><a href="/article/1087.htm"
                                       title="mongodb 环境搭建及简单CURD" target="_blank">mongodb 环境搭建及简单CURD</a>
                                    <span class="text-muted">antlove</span>
<a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/Install/1.htm">Install</a><a class="tag" taget="_blank" href="/search/curd/1.htm">curd</a><a class="tag" taget="_blank" href="/search/NoSQL/1.htm">NoSQL</a><a class="tag" taget="_blank" href="/search/mongo/1.htm">mongo</a>
                                    <div>一 搭建mongodb环境 
1. 在mongo官网下载mongodb 
2. 在本地创建目录 "D:\Program Files\mongodb-win32-i386-2.6.4\data\db" 
3. 运行mongodb服务 [mongod.exe --dbpath "D:\Program Files\mongodb-win32-i386-2.6.4\data\</div>
                                </li>
                                <li><a href="/article/1214.htm"
                                       title="数据字典和动态视图" target="_blank">数据字典和动态视图</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%AD%97%E5%85%B8/1.htm">数据字典</a><a class="tag" taget="_blank" href="/search/%E5%8A%A8%E6%80%81%E8%A7%86%E5%9B%BE/1.htm">动态视图</a><a class="tag" taget="_blank" href="/search/%E7%B3%BB%E7%BB%9F%E5%92%8C%E5%AF%B9%E8%B1%A1%E6%9D%83%E9%99%90/1.htm">系统和对象权限</a>
                                    <div>数据字典(data dictionary)是 Oracle 数据库的一个重要组成部分,这是一组用于记录数据库信息的只读(read-only)表。随着数据库的启动而启动,数据库关闭时数据字典也关闭   数据字典中包含 
  
 
 数据库中所有方案对象(schema object)的定义(包括表,视图,索引,簇,同义词,序列,过程,函数,包,触发器等等) 
 数据库为一</div>
                                </li>
                                <li><a href="/article/1341.htm"
                                       title="多线程编程一般规则" target="_blank">多线程编程一般规则</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/thread/1.htm">thread</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a><a class="tag" taget="_blank" href="/search/java%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">java多线程</a>
                                    <div>       如果两个工两个以上的线程都修改一个对象,那么把执行修改的方法定义为被同步的,如果对象更新影响到只读方法,那么只读方法也要定义成同步的。 
       不要滥用同步。如果在一个对象内的不同的方法访问的不是同一个数据,就不要将方法设置为synchronized的。 
</div>
                                </li>
                                <li><a href="/article/1468.htm"
                                       title="将文件或目录拷贝到另一个Linux系统的命令scp" target="_blank">将文件或目录拷贝到另一个Linux系统的命令scp</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/unix/1.htm">unix</a><a class="tag" taget="_blank" href="/search/scp/1.htm">scp</a>
                                    <div>一.功能说明        scp就是security copy,用于将文件或者目录从一个Linux系统拷贝到另一个Linux系统下。scp传输数据用的是SSH协议,保证了数据传输的安全,其格式如下:        scp 远程用户名@IP地址:文件的绝对路径</div>
                                </li>
                                <li><a href="/article/1595.htm"
                                       title="【持久化框架MyBatis3五】MyBatis3一对多关联查询" target="_blank">【持久化框架MyBatis3五】MyBatis3一对多关联查询</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/Mybatis3/1.htm">Mybatis3</a>
                                    <div>以教员和课程为例介绍一对多关联关系,在这里认为一个教员可以叫多门课程,而一门课程只有1个教员教,这种关系在实际中不太常见,通过教员和课程是多对多的关系。 
  示例数据:
  
  
地址表: 
  
CREATE TABLE ADDRESSES 
(
  ADDR_ID INT(11) NOT NULL AUTO_INCREMENT,
  STREET VAR</div>
                                </li>
                                <li><a href="/article/1722.htm"
                                       title="cookie状态判断引发的查找问题" target="_blank">cookie状态判断引发的查找问题</a>
                                    <span class="text-muted">bitcarter</span>
<a class="tag" taget="_blank" href="/search/form/1.htm">form</a><a class="tag" taget="_blank" href="/search/cgi/1.htm">cgi</a>
                                    <div>先说一下我们的业务背景: 
1.前台将图片和文本通过form表单提交到后台,图片我们都做了base64的编码,并且前台图片进行了压缩 
2.form中action是一个cgi服务 
3.后台cgi服务同时供PC,H5,APP 
4.后台cgi中调用公共的cookie状态判断方法(公共的,大家都用,几年了没有问题) 
 
问题:(折腾两天。。。。) 
1.PC端cgi服务正常调用,cookie判断没</div>
                                </li>
                                <li><a href="/article/1849.htm"
                                       title="通过Nginx,Tomcat访问日志(access log)记录请求耗时" target="_blank">通过Nginx,Tomcat访问日志(access log)记录请求耗时</a>
                                    <span class="text-muted">ronin47</span>

                                    <div>一、Nginx通过$upstream_response_time $request_time统计请求和后台服务响应时间 
nginx.conf使用配置方式: 
log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_r</div>
                                </li>
                                <li><a href="/article/1976.htm"
                                       title="java-67- n个骰子的点数。 把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。" target="_blank">java-67- n个骰子的点数。 把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>

public class ProbabilityOfDice {

	/**
	 * Q67 n个骰子的点数
	 * 把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。
	 * 在以下求解过程中,我们把骰子看作是有序的。
	 * 例如当n=2时,我们认为(1,2)和(2,1)是两种不同的情况
	 */
	private stati</div>
                                </li>
                                <li><a href="/article/2103.htm"
                                       title="看别人的博客,觉得心情很好" target="_blank">看别人的博客,觉得心情很好</a>
                                    <span class="text-muted">Cb123456</span>
<a class="tag" taget="_blank" href="/search/%E5%8D%9A%E5%AE%A2/1.htm">博客</a><a class="tag" taget="_blank" href="/search/%E5%BF%83%E6%83%85/1.htm">心情</a>
                                    <div>   以为写博客,就是总结,就和日记一样吧,同时也在督促自己。今天看了好长时间博客: 
   职业规划: 
   http://www.iteye.com/blogs/subjects/zhiyeguihua 
  
   android学习: 
   1.http://byandby.i</div>
                                </li>
                                <li><a href="/article/2230.htm"
                                       title="[JWFD开源工作流]尝试用原生代码引擎实现循环反馈拓扑分析" target="_blank">[JWFD开源工作流]尝试用原生代码引擎实现循环反馈拓扑分析</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C%E6%B5%81/1.htm">工作流</a>
                                    <div> 
    我们已经不满足于仅仅跳跃一次,通过对引擎的升级,今天我测试了一下循环反馈模式,大概跑了200圈,引擎报一个溢出错误 
 
     在一个流程图的结束节点中嵌入一段方程,每次引擎运行到这个节点的时候,通过实时编译器GM模块,计算这个方程,计算结果与预设值进行比较,符合条件则跳跃到开始节点,继续新一轮拓扑分析,直到遇到</div>
                                </li>
                                <li><a href="/article/2357.htm"
                                       title="JS常用的事件及方法" target="_blank">JS常用的事件及方法</a>
                                    <span class="text-muted">cwqcwqmax9</span>
<a class="tag" taget="_blank" href="/search/js/1.htm">js</a>
                                    <div>事件 描述 
onactivate 当对象设置为活动元素时触发。 
onafterupdate 当成功更新数据源对象中的关联对象后在数据绑定对象上触发。 
onbeforeactivate 对象要被设置为当前元素前立即触发。 
onbeforecut 当选中区从文档中删除之前在源对象触发。 
onbeforedeactivate 在 activeElement 从当前对象变为父文档其它对象之前立即</div>
                                </li>
                                <li><a href="/article/2484.htm"
                                       title="正则表达式验证日期格式" target="_blank">正则表达式验证日期格式</a>
                                    <span class="text-muted">dashuaifu</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><a class="tag" taget="_blank" href="/search/IT%E5%85%B6%E5%AE%83/1.htm">IT其它</a><a class="tag" taget="_blank" href="/search/java%E5%85%B6%E5%AE%83/1.htm">java其它</a>
                                    <div>                 正则表达式验证日期格式

function isDate(d){
 var v = d.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/i);
 if(!v) {
  this.focus();
  return false;
 }
}
<input value="2000-8-8" onblu</div>
                                </li>
                                <li><a href="/article/2611.htm"
                                       title="Yii CModel.rules() 方法 、validate预定义完整列表、以及说说验证" target="_blank">Yii CModel.rules() 方法 、validate预定义完整列表、以及说说验证</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/yii/1.htm">yii</a>
                                    <div>public array rules () {return} array 要调用 validate() 时应用的有效性规则。 返回属性的有效性规则。声明验证规则,应重写此方法。 每个规则是数组具有以下结构:array('attribute list', 'validator name', 'on'=>'scenario name', ...validation </div>
                                </li>
                                <li><a href="/article/2738.htm"
                                       title="UITextAttributeTextColor = deprecated in iOS 7.0" target="_blank">UITextAttributeTextColor = deprecated in iOS 7.0</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a>
                                    <div>In this lesson we used the key "UITextAttributeTextColor" to change the color of the UINavigationBar appearance to white. This prompts a warning "first deprecated in iOS 7.0." 
Ins</div>
                                </li>
                                <li><a href="/article/2865.htm"
                                       title="判断一个数是质数的几种方法" target="_blank">判断一个数是质数的几种方法</a>
                                    <span class="text-muted">EmmaZhao</span>
<a class="tag" taget="_blank" href="/search/Math/1.htm">Math</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                                    <div>质数也叫素数,是只能被1和它本身整除的正整数,最小的质数是2,目前发现的最大的质数是p=2^57885161-1【注1】。 
判断一个数是质数的最简单的方法如下: 
 

def isPrime1(n):
	for i in range(2, n):
		if n % i == 0:
			return False
	return True
 
但是在上面的方法中有一些冗余的计算,所以</div>
                                </li>
                                <li><a href="/article/2992.htm"
                                       title="SpringSecurity工作原理小解读" target="_blank">SpringSecurity工作原理小解读</a>
                                    <span class="text-muted">坏我一锅粥</span>
<a class="tag" taget="_blank" href="/search/SpringSecurity/1.htm">SpringSecurity</a>
                                    <div> 
   SecurityContextPersistenceFilter 
   ConcurrentSessionFilter 
   WebAsyncManagerIntegrationFilter 
   HeaderWriterFilter 
   CsrfFilter 
   LogoutFilter 
   Use</div>
                                </li>
                                <li><a href="/article/3119.htm"
                                       title="JS实现自适应宽度的Tag切换" target="_blank">JS实现自适应宽度的Tag切换</a>
                                    <span class="text-muted">ini</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a>
                                    <div>效果体验:http://hovertree.com/texiao/js/3.htm 
  
该效果使用纯JavaScript代码,实现TAB页切换效果,TAB标签根据内容自适应宽度,点击TAB标签切换内容页。 
HTML文件代码: 
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"</div>
                                </li>
                                <li><a href="/article/3246.htm"
                                       title="Hbase Rest API : 数据查询" target="_blank">Hbase Rest API : 数据查询</a>
                                    <span class="text-muted">kane_xie</span>
<a class="tag" taget="_blank" href="/search/REST/1.htm">REST</a><a class="tag" taget="_blank" href="/search/hbase/1.htm">hbase</a>
                                    <div>hbase(hadoop)是用java编写的,有些语言(例如python)能够对它提供良好的支持,但也有很多语言使用起来并不是那么方便,比如c#只能通过thrift访问。Rest就能很好的解决这个问题。Hbase的org.apache.hadoop.hbase.rest包提供了rest接口,它内嵌了jetty作为servlet容器。 
  
启动命令:./bin/hbase rest s</div>
                                </li>
                                <li><a href="/article/3373.htm"
                                       title="JQuery实现鼠标拖动元素移动位置(源码+注释)" target="_blank">JQuery实现鼠标拖动元素移动位置(源码+注释)</a>
                                    <span class="text-muted">明子健</span>
<a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/js/1.htm">js</a><a class="tag" taget="_blank" href="/search/%E6%BA%90%E7%A0%81/1.htm">源码</a><a class="tag" taget="_blank" href="/search/%E6%8B%96%E5%8A%A8/1.htm">拖动</a><a class="tag" taget="_blank" href="/search/%E9%BC%A0%E6%A0%87/1.htm">鼠标</a>
                                    <div>欢迎讨论指正! 
  
print.html代码: 
<!DOCTYPE html>
<html>
<head>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
<title>发票打印</title>
&l</div>
                                </li>
                                <li><a href="/article/3500.htm"
                                       title="Postgresql 连表更新字段语法 update" target="_blank">Postgresql 连表更新字段语法 update</a>
                                    <span class="text-muted">qifeifei</span>
<a class="tag" taget="_blank" href="/search/PostgreSQL/1.htm">PostgreSQL</a>
                                    <div>下面这段sql本来目的是想更新条件下的数据,可是这段sql却更新了整个表的数据。sql如下: 
UPDATE tops_visa.visa_order
SET op_audit_abort_pass_date = now()
FROM
	tops_visa.visa_order as  t1
INNER JOIN tops_visa.visa_visitor as t2 
ON t1. </div>
                                </li>
                                <li><a href="/article/3627.htm"
                                       title="将redis,memcache结合使用的方案?" target="_blank">将redis,memcache结合使用的方案?</a>
                                    <span class="text-muted">tcrct</span>
<a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/cache/1.htm">cache</a>
                                    <div>公司架构上使用了阿里云的服务,由于阿里的kvstore收费相当高,打算自建,自建后就需要自己维护,所以就有了一个想法,针对kvstore(redis)及ocs(memcache)的特点,想自己开发一个cache层,将需要用到list,set,map等redis方法的继续使用redis来完成,将整条记录放在memcache下,即findbyid,save等时就memcache,其它就对应使用redi</div>
                                </li>
                                <li><a href="/article/3754.htm"
                                       title="开发中遇到的诡异的bug" target="_blank">开发中遇到的诡异的bug</a>
                                    <span class="text-muted">wudixiaotie</span>
<a class="tag" taget="_blank" href="/search/bug/1.htm">bug</a>
                                    <div>今天我们服务器组遇到个问题: 
我们的服务是从Kafka里面取出数据,然后把offset存储到ssdb中,每个topic和partition都对应ssdb中不同的key,服务启动之后,每次kafka数据更新我们这边收到消息,然后存储之后就发现ssdb的值偶尔是-2,这就奇怪了,最开始我们是在代码中打印存储的日志,发现没什么问题,后来去查看ssdb的日志,才发现里面每次set的时候都会对同一个key</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>