Very simple way to get attributes in view.js is to pass as varibales in save.js like this using JSON.stringnify() (code line: { var testimonialsSlides=${ JSON.stringify(slides) } } ):
export default function Save({ attributes }) {
const { title, slides } = attributes;
const {blockClassName, blockStyleObject } = useBlockStyle( 'testimonials', {
color: attributes.color,
bgColor: attributes.bgColor,
} );
const blockProps = useBlockProps.save({
className: `${blockClassName} ${blockClassName}-${ attributes.clientId }`,
style: blockStyleObject
});
return (
<div {...blockProps}>
<div className={`${blockClassName}__icon`}></div>
<RichText.Content value={ title } tagName="p" className={`${blockClassName}__title`} />
<div className={`swiper ${blockClassName}__swiper`}>
<div className="swiper-wrapper">
{slides.map(( slide, index ) => (
<div className={ `swiper-slide ${ index === 0 ? 'swiper-slide-active' : '' }` }>
<div className="wp-block-oimocode-testimonials__item">
<div className="wp-block-oimocode-testimonials__rating">
<FontAwesomeIcon icon={faStar} />
<FontAwesomeIcon icon={faStar} />
<FontAwesomeIcon icon={faStar} />
<FontAwesomeIcon icon={faStar} />
<FontAwesomeIcon icon={faStar} />
</div>
<RichText.Content value={ slide.content } tagName="p" className={`${blockClassName}__review`} />
</div>
</div>
))}
</div>
<div className="swiper-pagination">
{slides.map(( slide, index ) => (
<span className={ `swiper-pagination-bullet ${ index === 0 ? 'swiper-pagination-bullet-active' : '' }` }>
{ slide.imgUrl && <img src={ slide.imgUrl } alt={ `reviewer-avatar-${ index }` } />}
{ ! slide.imgUrl && <FontAwesomeIcon icon={faUser} /> }
</span>
))}
</div>
</div>
<script>{ `var testimonialsSlides=${ JSON.stringify(slides) }` }</script>
</div>
);
}