tỷ lệ kèo cá cược bóng đá Giải thích mã nguồn Phạm vi Radar OSS phản ứng thứ 3 (3/3)

Cột kỹ thuật

[tỷ lệ kèo cá cược bóng đá 3] Giải thích mã nguồn Phạm vi Radar React OSS

Phạm vi radar OSS

3) Thành tỷ lệ kèo cá cược bóng đá radar

Thành tỷ lệ kèo cá cược bóng đá radar

Các thành tỷ lệ kèo cá cược bóng đá trước hiển thị HTML, nhưng thành tỷ lệ kèo cá cược bóng đá radarHTML?Không có sự khác biệt lớn nào ngoại trừ điều đó Hơn nữa,tương thích với các trình duyệt hiện đại sau IE9, vì vậy nó có thể được vẽ mà không gặp vấn đề gì trong hầu hết các môi trường Nếu bạn muốn làm cho nó tương thích với IE6, 7 và 8, bạn cũng sẽ cần sử dụng công nghệ có tên VML, nhưng lần này nó không được hỗ trợ VML (Ngôn ngữ đánh dấu vectơ) là ngôn ngữ XML để vẽ hình ảnh ở định dạng vector, là định dạng dữ liệu để thể hiện đồ họa máy tính hai chiều bên trong máy tính

Đầu tiên, chúng ta hãy xem Radarjsx

varPhản ứng= yêu cầu('Phản ứng');
varRadarTiền cảnh= yêu cầu('/RadarForeground');
varRadarNền= yêu cầu('/RadarBackground');
varHằng số= yêu cầu('/Hằng số');
 
varRa-đa=​Phản ứng.createClass({
  kết xuất:chức năng() {
    trở về (
      <khóa svg="Rađa"chiều rộng={Hằng số.RADER_WIDTH}chiều cao={Hằng số.RADER_HEIGHT}>
        <RadarBackground nămTháng={cái này.đạo cụ.nămTháng}danh mục={cái này.đạo cụ.danh mục}isChildCategory={cái này.đạo cụ.isChildCategory}/>
        <RadarForeground dotPosition={cái này.đạo cụ.dotPosition}đã chọnOssId={cái này.đạo cụ.đã chọnOssId}/>
      </svg>
    );
  }
});
 
mô-đun.xuất=Ra-đa;

Như bạn có thể thấy trong mã ở trên, có hai thành tỷ lệ kèo cá cược bóng đá bên trong thẻ svg

Tên phương thức Vẽ gì vậy
RadarBackground Nền radar
Tiền cảnh Radar Dấu chấm thể hiện thứ hạng

Bản vẽ thực tế được thực hiện trong từng thành tỷ lệ kèo cá cược bóng đá Đầu tiên, chúng ta hãy xem RadarBackground

RadarBackground

nền

  kết xuất:chức năng() {
    trở về (
      <g>
        { cái này._circles() }
        { cái này._borders() }
        { cái này._ranks() }
        { cái này._categoryName() }
      </g>
    );
  },

Phương thức kết xuất bao gồm bốn phương thức Chúng ta sẽ lần lượt xem xét từng cái

Tên phương thức Mô tả
_circles Vẽ hình tròn nền
_borders Một đường thẳng ngăn cách các vòng tròn
_ranks Tỷ lệ được đánh dấu 1,2,3,4
_categoryName Tên danh mục

phương thức _circles

vòng kết nối

Phương pháp này vẽ tĩnh bốn vòng tròn đã tạonhư sau Tôi không làm điều gì đặc biệt khó khăn cả

<vòng tròn cx="320" cy="330" r="70" điền="không có" đột quỵ="#666666" phản ứng dữ liệu="04000:$circle-0"></vòng tròn>
<vòng tròn cx="320" cy="330" r="140" điền="không có" đột quỵ="#666666" phản ứng dữ liệu="04000:$circle-1"></vòng tròn>
<vòng tròn cx="320" cy="330" r="210" điền="không có" đột quỵ="#666666" phản ứng dữ liệu="04000:$circle-2"></vòng tròn>
<vòng tròn cx="320" cy="330" r="280" điền="không có" đột quỵ="#666666" phản ứng dữ liệu="04000:$circle-3"></vòng tròn>

ở trênChỉ cần gói các thẻ vòng tròn vào một mảng và trả lại Mã nguồn như dưới đây

_circles:chức năng() {
  varvòng tròn= [];
  cho (vartôi= 0;tôi< 4;tôi++) {
  vòng kết nối.đẩy(<phím vòng tròn={"vòng tròn-" +tôi}cx={Hằng số.RADER_CENTER_X}cy={Hằng số.RADER_CENTER_Y}r={(tôi+ 1) *Hằng số.RADER_SPACING}điền={Hằng số.RADER_FILL}đột quỵ={Hằng số.RADER_COLOR}></vòng tròn>);
  }
  trở vềvòng kết nối;
},

_phương thức viền

viền

Phương pháp này thay đổi số dòng được vẽ tùy thuộc vào số lượng danh mục Nếu có 5 tên danh mục thì có 5 mục Nếu có 6 tên danh mục thì có 6 mục Tính góc bằng số đường thẳng bạn vẽ và vẽ nó thực sự được tạo ranhư sau

<đường dẫn điền="không có" đột quỵ="#666666" d="M320,330l18369701987210297e-14,-300z" phản ứng dữ liệu="04001:$borders-0"></đường dẫn>
<đường dẫn điền="không có" đột quỵ="#666666" d="M320,330l2598076211353316,-150z" phản ứng dữ liệu="04001:$borders-1"></đường dẫn>
<đường dẫn điền="không có" đột quỵ="#666666" d="M320,330l2598076211353316,14999999999999994z"  phản ứng dữ liệu="04001:$borders-2"></đường dẫn>
<đường dẫn điền="không có" đột quỵ="#666666" d="M320,330l18369701987210297e-14,300z" dữ liệu phản ứng="04001:$borders-3"></đường dẫn>
<đường dẫn điền="không có" đột quỵ="#666666" d="M320,330l-25980762113533154,1500000000000001z" phản ứng dữ liệu="04001:$borders-4"></đường dẫn>
<đường dẫn điền="không có" đột quỵ="#666666" d="M320,330l-2598076211353317,-149999999999999983z" phản ứng dữ liệu="04001:$borders-5"></đường dẫn>

Điều này được thể hiện trong mã nguồn như sau Tại thời điểm này, số lượng đường vẽ thay đổi tùy thuộc vào số lượng danh mục, vì vậy hãy tính góc từ số lượng danh mục và chuyển đổi nó sang tọa độ XY bằng các hàm lượng giác

_biên giới:chức năng() {
  varđường viền= [];
  cho (vartôi= 0,len= cái này.đạo cụ.danh mục.độ dài;tôi<len;tôi++) {
    varseta= (2 * Toán.PI/ len) *tôi;
    vary=Hằng số.RADER_RADIUS* Toán.tội lỗi(seta- Toán.PI/2);
    varx=Hằng số.RADER_RADIUS* Toán.cos(seta- Toán.PI/2);
  biên giới.đẩy(<khóa đường dẫn={"biên giới-" +tôi}điền={Hằng số.RADER_FILL}đột quỵ={Hằng số.RADER_COLOR}d={'M320,330l' +x+ ',' +y+ 'z'}></path>);
  }
  trở vềbiên giới;
},

phương thức _ranks

thứ hạng

Vẽ số biểu thị thứ hạng radar Điều này không thay đổi tùy thuộc vào radar, do đó, tĩnh như sau

<văn bản x="320" y="295" phản ứng dữ liệu="04002:$ranks-1">4</văn bản>
<văn bản x="320" y="225" phản ứng dữ liệu="04002:$ranks-2">3</văn bản>
<văn bản x="320" y="155" phản ứng dữ liệu="04002:$ranks-3">2</văn bản>
<văn bản x="320" y="85" phản ứng dữ liệu="04002:$ranks-4">1</văn bản>

Mã nguồn như sau

_ranks:chức năng() {
  varxếp hạng= [];
  cho (vartôi= 1;tôi<= 4;tôi++) {
    vary=Hằng số.RADER_CENTER_Y- (Hằng số.RADER_SPACING*tôi) + (Hằng số.RADER_SPACING / 2);
  xếp hạng.đẩy(<khóa văn bản={"xếp hạng-" +tôi}tên lớp="văn bản xếp hạng"x={Hằng số.RADER_CENTER_X}y={y}phông chữ="10px Arial">{5 -tôi}</văn bản>);
  }
  trở vềxếp hạng;
},

phương thức_categoryName

tên danh mục

Vẽ tên danh mục bằng số lượng danh mục thực sự đã được vẽđược hiển thị dưới đây

<g chuyển đổi="dịch(320,330) xoay(30)" phản ứng dữ liệu="04003:$category-label-group-0">
  <văn bản chuyển đổi="xoay(0,0,-300)" y="-300" đột quỵ="không có" điền="#666666" kiểu dáng="font-size:14px;font-family:Arial;text-anchor:middle;" dữ liệu phản ứng="04003:$category-label-group-0$category-label-0">Thư viện/Khung</văn bản>
</g>
<g chuyển đổi="dịch(320,330) xoay(90)" phản ứng dữ liệu="04003:$category-label-group-1">
  <văn bản chuyển đổi="xoay(0,0,-300)" y="-300" đột quỵ="không có" điền="#666666" kiểu dáng="font-size:14px;font-family:Arial;text-anchor:middle;" phản ứng dữ liệu="04003:$category-label-group-1$category-label-1">Ứng dụng</văn bản>
</g>
<g chuyển đổi="dịch(320,330) xoay(150)" phản ứng dữ liệu="04003:$category-label-group-2">
  <văn bản chuyển đổi="xoay(180,0,-300)" y="-300" đột quỵ="không có" điền="#666666" kiểu dáng="font-size:14px;font-family:Arial;text-anchor:middle;" phản ứng dữ liệu="04003:$category-label-group-2$category-label-2">Công cụ</văn bản>
</g>
<g chuyển đổi="dịch(320,330) xoay(210)" phản ứng dữ liệu="04003:$category-label-group-3">
  <văn bản chuyển đổi="xoay(180,0,-300)" y="-300" đột quỵ="không có" điền="#666666" kiểu dáng="font-size:14px;font-family:Arial;text-anchor:middle;" phản ứng dữ liệu="04003:$category-label-group-3$category-label-3">tỷ lệ kèo cá cược bóng đá mềm trung gian</văn bản>
</g>
<g chuyển đổi="dịch(320,330) xoay(270)" dữ liệu phản ứng="04003:$category-label-group-4">
  <văn bản chuyển đổi="xoay(0,0,-300)" y="-300" đột quỵ="không có" điền="#666666" kiểu dáng="font-size:14px;font-family:Arial;text-anchor:middle;" phản ứng dữ liệu="04003:$category-label-group-4$category-label-4">Nền tảng</văn bản>
</g>
<g chuyển đổi="dịch(320,330) xoay(330)" phản ứng dữ liệu="04003:$category-label-group-5">
  <văn bản chuyển đổi="xoay(0,0,-300)" y="-300" đột quỵ="không có" điền="#666666" kiểu dáng="font-size:14px;font-family:Arial;text-anchor:middle;" phản ứng dữ liệu="04003:$category-label-group-5$category-label-5">Hệ thống xử lý ngôn ngữ</văn bản>
</g>

Lúc này, văn bản của tên danh mục được tính toán để vẽ chính xác giữa các dòng được vẽ giống như phương thức _borders trước đó

_categoryName:chức năng() {
  var_cái này= cái này;
  trở về cái này.đạo cụ.danh mục.bản đồ(chức năng(danh mục,i) {
    varvăn bảnStyle= {
    cỡ chữ: '14px',
    phông chữFamily: 'Arial',
 văn bảnAnchor: 'giữa'
    };
    nếu (!_this.đạo cụ.isChildCategory)textStyle.con trỏ= 'con trỏ';
    vardịch= 'dịch(' + Hằng số.RADER_CENTER_X+ ',' +Hằng số.RADER_CENTER_Y+ ')';
    varcung= 360/ _này.đạo cụ.danh mục.độ dài;
    varradian=cung*tôi+cung /2;
    varxoay= 'xoay(' +radian+ ')';
    varbiến đổi=dịch+ ' ' +xoay;
    //Xoay nhãn dưới cùng 180 độ 
    varnhãnRot=radian> 90 &&radian< 270 ? 180 : 0;
    trở lại (
      <phím g={'danh mục-nhãn-nhóm-' +tôi}biến đổi={chuyển đổi}>
        <khóa văn bản={'nhãn danh mục-' +tôi}tên lớp="nhãn danh mục"dữ liệu-mã danh mục={danh mục.id}biến đổi={'xoay(' +nhãnRot+ ',0,-300)'}y="-300"đột quỵ="không có"điền="#666666"phong cách={textStyle}>{danh mục.tên hiển thị}</văn bản>
      </g>
    );
  });
},

Các phương pháp khác

phương thức thành phầnDidMount cho biết thành tỷ lệ kèo cá cược bóng đá này làĐược thực thi khi được thêm vào cây Ở đây, một sự kiện nhấp chuột được thêm vào nội dung Bằng cách gán sự kiện nhấp chuột vào thẻ body, bạn có thểđây Tốt hơn là nên nhận các sự kiện ở cấp cao nhất có thể trong hệ thống phân cấp, vì điều này hiệu quả hơn việc chỉ định trình xử lý sự kiện nhấp chuột cho từng tỷ lệ kèo cá cược bóng đá tử

Phương thức _categoryClick được đăng ký làm trình nghe như sau

_onCategoryClick:chức năng(e) {
  nếu (e.mục tiêu.tên thẻ.toUpperCase() !== 'TEXT' || cái này.đạo cụ.isChildCategory) trở lại;
  varid danh mục=e.mục tiêu.getAttribution('id danh mục dữ liệu');
  cái này.chuyển sang(Hằng số.ROOT_PATH+ 'radarPhạm vi/danh mục/' +id danh mục+ '/' + cái này.đạo cụ.nămTháng);
},

Thẻ được nhấp vàothì màn hình sẽ chuyển tiếp Nói cách khác, trong trường hợp này, nó giống như khi danh mục được nhấp vào Thực thi phương thức transitionTo của ReactRouter

RadarForeground

tiền cảnh

varPhản ứng= yêu cầu('Phản ứng');
varuuid= yêu cầu('nút-uuid');
varDấu chấm= yêu cầu('/Dot');
varRadarStore= yêu cầu('/stores/RadarStore');
varHằng số= yêu cầu('/Hằng số');
 
varRadarTiền cảnh=Phản ứng.tạoLớp({
  kết xuất:chức năng() {
    var_cái này= cái này;
    varvị trí= cái này.đạo cụ.dotPosition;
    varx= {};
    trở lại (
      <phím g="tiền cảnh">
        {vị trí.bản đồ(chức năng(pos,i) {
          trở lại <Phím chấm={'dấu chấm-' +vị trí.sản phẩm.id}số={pos.số}điền={pos.màu}sản phẩm={pos.sản phẩm}x={pos.x}y={pos.y}đã chọnOssId={_this.đạo cụ.đã chọnOssId}/>
        })}
      </g>
    );
  },
 
});
 
mô-đun.xuất khẩu=RadarTiền cảnh;

RadarForeground đang vẽ các dấu chấm Một Dot được tạo đơn giản dựa trên thông tin dotPosition được truyền dưới dạng đạo cụ

Dấu chấm

Dấu chấm

Dấu chấm tượng trưng cho từng dấu chấm trên Nếu bạn nghĩ về nó một mình, nó không khó chút nào Tuy nhiên, thành tỷ lệ kèo cá cược bóng đá Dot sẽ hoạt hình khi vị trí của nó thay đổi Tính năng này bao gồmTôi đang sử dụng thẻ animateTransform cho chức năng hoạt ảnh, nhưng Reactjs không nhận dạng tốt thẻ này nên tôi sẽ tạo thẻ animateTransform bằng phương thức thành phầnDidUpdate

Thực tếsẽ trông như thế này:

<g chuyển đổi="dịch(388 147)" dữ liệu phản ứng="0401$dot-148">
  <vòng tròn r="8" kiểu dáng="điền:#297acc;đột quỵ:#297acc;" dữ liệu phản ứng="0401$dot-148$dot-110-circle"></vòng tròn>
  <văn bản y="3" kiểu dáng="font-family:Arial;đột quỵ:none;fill:#ffffff;text-anchor:middle;font-size:9px;font-weight:bold;" phản ứng dữ liệu="0401$dot-148$dot-110-text">110</văn bản>
  <animateTransform tên thuộc tính="chuyển đổi" loại="dịch" dur="1s" từ="461,195" đến="388,147" điền="đóng băng" bắt đầu="không xác định" kết thúc="không xác định"></animateTransform>
</g>

Cũngsẽ hiển thị theo cùng một cách

kết xuất:chức năng() {
  varCircleStyle= {
 điền: cái này.đạo cụ.điền,
  đột quỵ: cái này.đạo cụ.điền
  };
  varvăn bảnStyle= {
  phông chữFamily: 'Arial',
  đột quỵ: 'không có',
 điền: '#ffffff',
 văn bảnAnchor: 'giữa',
  cỡ chữ: '9px',
  phông chữWeight: 'đậm'
  };
  nếu (!smilSupport|| !cái này._prevX) {
    varbiến đổi= 'dịch(' + cái này.đạo cụ.x + ',' + cái này.đạo cụ.y + ')';
  } khác {
    varbiến đổi= 'dịch(' + cái này._prevX+ ',' + cái này._prevY+ ')';
  }
  varchìa khóa= "dot-" + cái này.đạo cụ.số;
  trở lại (
    <phím g={khóa}giới thiệu="g"biến đổi={chuyển đổi}>
      {cái này._selectedCircle(khóa)}
      <phím vòng tròn={khóa + '-vòng tròn'}r="8"phong cách={circleStyle}trênMouseOver={cái này._onMouseOver}></vòng tròn>
      <khóa văn bản={khóa + '-văn bản'}y="3"phong cách={textStyle}trênMouseOver={cái này._onMouseOver}>{cái này.đạo cụ.số}</văn bản>
    </g>
  );
},

Đối với thẻ animateTransform trực tiếp trong phương thức thành phầnDidUpdate

Cuối cùng

Tôi phải mất một tháng ngoài giờ làm việc nhưng đã có thể triển khai lại OSS Radar Scope® bằng Reactjs (*Internet Explorer không được hỗ trợ, vì vậy vui lòng xem nó trong một trình duyệt khác Ngoài ra, nếu nó được hiển thị, hãy thử chỉ định "tháng hiển thị" ở cột bên trái)

Tôi cảm thấy Reactjs cho phép tôi viết mã rõ ràng mà không làm cho nó quá phức tạp Tôi không có kinh nghiệm với nhiều người phát triển bằng Reactjs, nhưng tôi nghĩ nó dễ phát triển hơn jQuery truyền thống vì các thành tỷ lệ kèo cá cược bóng đá có thể được tách biệt rõ ràng Tôi hy vọng có thể sử dụng nó trong các dự án phát triển thực tế trong tương lai